mysql – UTF-8字符问题;我看到的不是我存储的东西
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了mysql – UTF-8字符问题;我看到的不是我存储的东西,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3061字,纯文字阅读大概需要5分钟。
内容图文
![mysql – UTF-8字符问题;我看到的不是我存储的东西](/upload/InfoBanner/zyjiaocheng/891/05060a5a51e348749da013005694c83e.jpg)
我试图使用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的开头
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
标签:mysql,unicode,character-encoding,utf-8,mariadb
来源: https://codeday.me/bug/20190910/1802046.html