MySQL 数据库 - 将字符集和排序规则转换为 utf8mb4 和 utf8mb4_unicode_ci?

Posted

技术标签:

【中文标题】MySQL 数据库 - 将字符集和排序规则转换为 utf8mb4 和 utf8mb4_unicode_ci?【英文标题】:MySQL database - conversion of characterset and collation to utf8mb4 and utf8mb4_unicode_ci? 【发布时间】:2018-06-08 09:28:43 【问题描述】:

我已按照here 的建议使用以下命令将我的 mysql 数据库的字符集和排序规则从 latin1 转换为 utf8mb4。

ALTER DATABASE databasename CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

为了检查转换是否正确完成,我运行了以下命令。

  SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' 
  OR Variable_name LIKE 'collation%' 

输出是

虽然 character_set_client、character_set_connection、character_set_database、character_set_results 现在是 utf8mb4,但 character_set_filesystem 是二进制,而 character_set_server 仍然是拉丁文。这些到底是什么以及为什么它仍然不在 utf8mb4 中?

同样,collat​​ion_connection 和 collat​​ion_database 在 utf8mb4_unicode_ci 中,但 collat​​ion_server 仍然在 latin1_swedish_ci 中

【问题讨论】:

SELECT HEX(col) ... 看看一些非英文字符的样子。这将有助于验证转换是否正确。 【参考方案1】:

https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_character_set_filesystem

此变量用于解释引用文件名的字符串文字,例如在 LOAD DATA INFILE 和 SELECT ... INTO OUTFILE 语句和 LOAD_FILE() 函数中。在尝试打开文件之前,此类文件名会从 character_set_client 转换为 character_set_filesystem。默认值为二进制,表示不进行转换。

您可能不需要更改此值。

https://dev.mysql.com/doc/refman/5.7/en/charset-server.html

如果在 CREATE DATABASE 语句中未指定数据库字符集和排序规则,则使用服务器字符集和排序规则作为默认值。他们没有其他目的。

您可以在 /etc/my.cnf 中更改此值,但这是多余的,因为如果您已经为每个数据库指定了字符集。

【讨论】:

以上是关于MySQL 数据库 - 将字符集和排序规则转换为 utf8mb4 和 utf8mb4_unicode_ci?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法将所有现有的表数据转换为 UTF8 排序规则?

所有语言的 MySQL 排序规则

SQL Server - 将 varchar 转换为另一个排序规则(代码页)以修复字符编码

MySQL如何指定字符集和排序规则?

是否可以让 SQL Server 将排序规则转换为 UTF-8 / UTF-16

mysql汉字排序规则