我试图使用UTF-8并遇到麻烦。
我尝试了很多事情;这是我得到的结果:
????
Se?or
Señor
Señor
新浪新闻
新浪新闻
Se
我究竟做错了什么?我该如何修复 代码 ?我可以恢复 数据 吗?
这个问题困扰着该站点的参与者以及其他许多人。
您列出了五个主要的CHARACTER SET麻烦案例。
CHARACTER SET
最佳实践
展望未来,最好使用CHARACTER SET utf8mb4和COLLATION utf8mb4_unicode_520_ci。(管道中有更新版本的Unicode排序规则。)
CHARACTER SET utf8mb4
COLLATION utf8mb4_unicode_520_ci
utf8mb4是的超集utf8,它处理4字节utf8代码,表情符号和某些中文需要这些代码。
utf8mb4
utf8
在MySQL之外,“ UTF-8”是指所有大小的编码,因此实际上与MySQL相同utf8mb4,而不是utf8。
在下文中,我将尝试使用这些拼写和大写字母来区分MySQL内部和外部。
您 应 该做什么概述
<form accept-charset="UTF-8">
SHOW CREATE TABLE
<meta charset=UTF-8>
UTF-8贯穿始终
有关计算机语言的更多详细信息(及其后续部分)
测试数据
使用工具或工具查看数据SELECT是不可信的。太多这样的客户端,尤其是浏览器,试图补偿不正确的编码,并向您显示正确的文本,即使数据库已损坏。因此,选择一个包含非英语文本的表和列,然后执行
SELECT
SELECT col, HEX(col) FROM tbl WHERE ...
正确存储的UTF-8的十六进制将为
20
4x
5x
6x
7x
Cxyy
Dxyy
Exyyzz
F0yyzzww
出现问题的具体原因和解决方法
截断的 文字(Se为Señor):
黑钻石 与问号(Se�or对Señor); 存在以下情况之一:
Se�or
情况1(原始字节 不是 UTF-8):
SET NAMES
INSERT
CHARACTER SET utf8
情况2(原始字节 为 UTF-8):
仅当浏览器设置为时,才会出现黑色菱形<meta charset=UTF-8>。
问号 (常规的,不是黑钻石)(Se?or用于Señor):
Mojibake (Señorfor Señor):(此讨论也适用于 Double Encoding ,它不一定可见。)
INSERTing
SELECTing
如果数据看起来正确,但排序不正确,则说明您选择了错误的排序规则,或者没有适合您的排序规则,或者您使用 Double Encoding 。
*通过执行SELECT .. HEX ..上述操作,可以确认 *双重编码 。
SELECT .. HEX ..
é should come back C3A9, but instead shows C383C2A9 The Emoji 👽 should come back F09F91BD, but comes back C3B0C5B8E28098C2BD
也就是说,十六进制的长度大约是它的两倍。这是由于从latin1(或任何其他形式)转换为utf8,然后将这些字节视为latin1并重复转换而引起的。排序(和比较)无法正常进行,因为例如,排序就像字符串是Señor。
修复数据
对于 截断 和 问号 ,数据将丢失。
对于 Mojibake / 双重编码 ,…
对于 黑钻石 ,…
该 修复程序 列在这里。(针对5种不同情况的5种修复;请谨慎选择):http : //mysql.rjweb.org/doc.php/charcoll#fixes_for_various_cases