将 MySQL 数据库从 latin1 转换为 utf8mb4 - 并处理德语变音

Ale*_*ber 7 mysql utf-8 encoding mysql-5.6

我正在使用 5.6.28 MySQL 社区服务器在 CentOS 6.7 Linux 服务器上以德语托管 WordPress + ProPhoto 博客:

mysql> show tables;
+-----------------------+
| Tables_in_blog        |
+-----------------------+
| wp_commentmeta        |
| wp_comments           |
| wp_links              |
| wp_options            |
| wp_postmeta           |
| wp_posts              |
| wp_term_relationships |
| wp_term_taxonomy      |
| wp_terms              |
| wp_usermeta           |
| wp_users              |
+-----------------------+
11 rows in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

然后最近我开始开发俄语应用程序,不得不在/etc/my.cnf中将MySQL 设置更改为utf8mb4编码:

[client]
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4

[mysqld]
character-set-client-handshake=FALSE
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
Run Code Online (Sandbox Code Playgroud)

现在我的第一个数据库有一个小问题,它仍然显示为latin1

mysql> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | latin1                     | HOW TO CONVERT?
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

请问将latin1数据库转换为utf8mb4的最佳方法是什么?

以及如何确保德语变音字符 ( ä ö ü) 在此过程中正确转换?

Ric*_*mes 13

这里有两个可能的问题,他们有两个不同的答案——

我如何制作所有新表 utf8mb4

可以在创建数据库时完成(对于一个数据库):

CREATE DATABASE dbname
    DEFAULT CHARACTER SET utf8mb4
    DEFAULT COLLATE       utf8mb4_unicode_ci;
Run Code Online (Sandbox Code Playgroud)

您可以ALTER数据库(类似的语法),但只提供了一个默认未来表。

存在与从“服务器”变量继承相关的错误: http://dev.mysql.com/worklog/task/?id=3811,所以我建议您简单地对每个数据库进行明确。

如何转换现有的 latin1 表

如果您有一个声明为latin1并且正确包含 latin1 字节的表,并且您想将所有字符/文本列更改为 utf8 ...

ALTER TABLE tbl CONVERT TO CHARACTER SET utf8mb4;
Run Code Online (Sandbox Code Playgroud)

这会更改定义并主动更改列中的必要字节。

ALTER TABLE tbl MODIFY col1 ... CHARACTER SET utf8mb4;
Run Code Online (Sandbox Code Playgroud)

与上述类似,但一次只能处理一列,并且需要在 MODIFY 子句中添加正确的内容。因此,这将是相当乏味的。但是,如果您只想更改某些列,它会很有用。