这个问题困扰着这个网站和许多其他网站的参与者.
您列出了CHARACTER SET
个故障的五个主要 case .
Best Practice
展望future ,最好使用CHARACTER SET utf8mb4
和COLLATION utf8mb4_unicode_520_ci
.(Unicode排序规则的更新版本正在准备中.)
utf8mb4
是utf8
的超集,因为它处理表情符号和一些中文符号所需的4字节utf8代码.
在MySQL之外,"UTF-8"指的是所有大小的编码,因此实际上与MySQL的utf8mb4
相同,而不是utf8
.
下面我将try 使用这些拼写和大写字母来区分MySQL内部和外部.
Overview of what you should do
- 将编辑器等设置为UTF-8.
- HTML表单应该从
<form accept-charset="UTF-8">
开始.
- 将字节编码为UTF-8.
- 将UTF-8设置为客户端使用的编码.
- 将列/表声明为
CHARACTER SET utf8mb4
(用SHOW CREATE TABLE
判断)
<meta charset=UTF-8>
在HTML的开头
- 存储 routine 获取当前字符集/排序规则.他们可能需要重建.
100
More details for computer languages(及其以下章节)
Test the data
不能信任使用工具或SELECT
查看数据.
SELECT col, HEX(col) FROM tbl WHERE ...
正确存储的UTF-8的十六进制将
- 空格(任何语言):
20
- 英语:
4x
、5x
、6x
或7x
- 对于大多数西欧国家来说,重音字母应该是
Cxyy
- 西里尔语、 hebrew 和波斯语/阿拉伯语:
Dxyy
- 亚洲大部分地区:
Exyyzz
- 表情符号和一些中文:
F0yyzzww
- More details
Specific causes and fixes of the problems seen
Truncated文本(Se
代表Señor
):
- 要存储的字节未编码为utf8mb4.修好这个.
- 此外,判断读取期间的连接是否为UTF-8.
Black Diamonds个带问号(Señor
个Se�or
);
case 1(原始字节为not UTF-8):
- 要存储的字节未编码为utf8.修好这个.
INSERT
and和SELECT
的连接(或SET NAMES
)不是utf8/utf8mb4.修好这个.
- 此外,判断数据库中的列是否为
CHARACTER SET utf8
(或utf8mb4).
case 2(原始字节were UTF-8):
SELECT
的连接(或SET NAMES
)不是utf8/utf8mb4.修好这个.
- 此外,判断数据库中的列是否为
CHARACTER SET utf8
(或utf8mb4).
只有当浏览器设置为<meta charset=UTF-8>
时,才会出现黑钻石.
Question Marks(普通钻石,非黑钻石)(Se?or
代表Señor
):
- 要存储的字节未编码为utf8/utf8mb4.修好这个.
- 数据库中的列不是
CHARACTER SET utf8
(或utf8mb4).修好这个.(使用SHOW CREATE TABLE
.)
- 此外,判断读取期间的连接是否为UTF-8.
Mojibake(Señor
为Señor
):
- 要存储的字节需要UTF-8编码.修好这个.
INSERTing
和SELECTing
文本时的连接需要指定utf8或utf8mb4.修好这个.
- 该列需要声明为
CHARACTER SET utf8
(或utf8mb4).修好这个.
- HTML应该以
<meta charset=UTF-8>
开头.
如果数据看起来正确,但排序不正确,那么
Double Encoding可以通过执行上述SELECT .. HEX ..
来确认.
é should come back C3A9, but instead shows C383C2A9
The Emoji ? should come back F09F91BD, but comes back C3B0C5B8E28098C2BD
也就是说,六边形的长度大约是其应有长度的两倍.
Fixing the Data, where possible
对于Truncation和Question Marks,数据丢失.
对于Mojibake/Double Encoding...
Black Diamonds美元...
这里列出了Fixes个.(针对5种不同情况的5种不同修复方法;仔细挑选):http://mysql.rjweb.org/doc.php/charcoll#fixes_for_various_cases