微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

mysql – UTF-8字符问题;我看到的不是我存储的东西

我试图使用UTF-8并遇到麻烦.

我尝试了很多东西;这是我得到的结果:

> ????而不是亚洲人物.即使是欧洲文本,我也有Se?或Señor.
>奇怪的乱语(Mojibake?)如新浪新闻,如SeÃ或或æ-°æμªæ-°é-».
>黑色钻石,如Se or.
>最后,我遇到了数据丢失或至少被截断的情况:Se为Señor.
>即使我看到正确的文字,它也没有正确排序.

我究竟做错了什么?我该如何修复代码?我可以恢复数据,如果是,如何恢复?

解决方法:

这个问题困扰着这个网站的参与者和许多其他人.

您列出了CHaraCTER SET故障的五个主要案例.

最佳实践

展望未来,最好使用CHaraCTER SET utf8mb4和COLLATION utf8mb4_unicode_520_ci. (管道中有一个较新版本的Unicode排序规则.)

utf8mb4是utf8的超集,因为它处理4字节的utf8代码,这是Emoji和一些中文所需要的.

MySQL之外,“UTF-8”指的是所有大小的编码,因此实际上与MysqL的utf8mb4相同,而不是utf8.

我将尝试使用这些拼写和大写来区分内部和外部MysqL.

您应该做什么的概述

>让您的编辑器等设置为UTF-8.
> HTML表单应该像< form accept-charset =“UTF-8”>一样开始.
>将您的字节编码为UTF-8.
>建立UTF-8作为客户端中使用的编码.
>将列/表声明为CHaraCTER SET utf8mb4(使用SHOW CREATE TABLE进行检查.)
>< Meta charset = UTF-8>在HTML的开头

UTF-8 all the way through

More details for computer languages(及其以下部分)

测试数据

使用工具或使用SELECT查看数据是不可信任的.
太多此类客户端(尤其是浏览器)会尝试补偿不正确的编码,并向您显示正确的文本,即使数据库被破坏也是如此.
因此,选择一个包含非英文文本的表和列

SELECT col, HEX(col) FROM tbl WHERE ...

正确存储的UTF-8的HEX将是

>对于空白区域(使用任何语言):20
>英语:4x,5x,6x或7x
>对于大多数西欧来说,重音字母应该是Cxyy
>西里尔语,希伯来语和波斯语/阿拉伯语:Dxyy
>亚洲大部分地区:Exyyzz
>表情符号和一些中文:F0yyzzww
> More details

找到问题的具体原因和解决方法

截断文本(Se为Señor):

>要存储的字节不编码为utf8mb4.解决这个问题.
>另外,检查读取期间的连接是否为UTF-8.

带有问号的黑色钻石(Señor为Señor);
其中一种情况存在:

案例1(原始字节不是UTF-8):

>要存储的字节不编码为utf8.解决这个问题.
> INSERT和SELECT的连接(或SET NAMES)不是utf8 / utf8mb4.解决这个问题.
>另外,检查数据库中的列是否为CHaraCTER SET utf8(或utf8mb4).

案例2(原始字节为UTF-8):

> SELECT的连接(或SET NAMES)不是utf8 / utf8mb4.解决这个问题.
>另外,检查数据库中的列是否为CHaraCTER SET utf8(或utf8mb4).

仅当浏览器设置为< Meta charset = UTF-8>时才会出现黑色菱形.

问号(常规的,不是黑色的钻石)(Se?或Señor):

>要存储的字节不编码为utf8 / utf8mb4.解决这个问题.
>数据库中的列不是CHaraCTER SET utf8(或utf8mb4).解决这个问题. (使用SHOW CREATE TABLE.)
>另外,检查读取期间的连接是否为UTF-8.

Mojibake(Señ或Señor):
(此讨论也适用于双重编码,不一定可见.)

>要存储的字节需要采用UTF-8编码.解决这个问题.
> INSERTing和SELECTing文本时的连接需要指定utf8或utf8mb4.解决这个问题.
>该列需要声明CHaraCTER SET utf8(或utf8mb4).解决这个问题.
> HTML应以< Meta charset = UTF-8>开头.

如果数据看起来正确,但不能正确排序,那么
要么你选错了整理,
或者没有适合您需要的整理,
或者你有双重编码.

可以通过执行上述SELECT .. HEX ..来确认双重编码.

é should come back C3A9, but instead shows C383C2A9
The Emoji
                
                                 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐