我将数据库转换为utf8mb4,但它仍然返回不正确的UTF8字符:
例如,Café
变为Café
下面是我的mysql排序变量:
mysql> SHOW VARIABLES LIKE 'char%'; SHOW VARIABLES LIKE 'collation%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8 |
| 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)
+----------------------+--------------------+
| Variable_name | Value |
+----------------------+--------------------+
| collation_connection | utf8mb4_unicode_ci |
| collation_database | utf8_general_ci |
| collation_server | utf8mb4_unicode_ci |
+----------------------+--------------------+
同时,我的DB已经慢了至少10倍,因为切换到utf8
莫吉贝克。这是典型的
- 您在客户端的字节被正确编码为utf8mb4(好)。
- 您连接到
SET NAMES latin1
(或set_charset('latin1')
或…),可能是默认的。(应该是utf8mb4
) - 表中的列可能是也可能不是
CHARACTER SET utf8mb4
,但它应该是。
如果您需要修复数据,则需要"两步ALTER",例如
ALTER TABLE Tbl MODIFY COLUMN col VARBINARY(...) ...;
ALTER TABLE Tbl MODIFY COLUMN col VARCHAR(...) ... CHARACTER SET utf8mb4 ...;
,其中长度足够大,另一个"…"包含已经在列上的其他内容(NOT NULL
等)