我试图使用UTF-8,但遇到了麻烦.

我try 过很多事情;以下是我得到的结果:

  • ????而不是亚洲字符.即使是欧洲文本,我也以Señor分获得Se?or分.
  • 奇怪的胡言乱语(莫吉巴克?)例如Señor新浪新闻代表新浪新闻.
  • 黑钻石,如selenium�或
  • 最后,我遇到了一个数据丢失或至少被截断的情况:Señor分为Se分.
  • 即使当我把短信打到look对的时候,它也不正确.

我做错了什么?我怎么修code?我能找回data吗?如果可以,怎么找回?

推荐答案

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

您列出了CHARACTER SET个故障的五个主要 case .

Best Practice

展望future ,最好使用CHARACTER SET utf8mb4COLLATION utf8mb4_unicode_520_ci.(Unicode排序规则的更新版本正在准备中.)

utf8mb4utf8的超集,因为它处理表情符号和一些中文符号所需的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
  • 英语:4x5x6x7x
  • 对于大多数西欧国家来说,重音字母应该是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ñorSe�or);

case 1(原始字节为not UTF-8):

  • 要存储的字节未编码为utf8.修好这个.
  • INSERT andSELECT的连接(或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ñorSeñor):

  • 要存储的字节需要UTF-8编码.修好这个.
  • INSERTingSELECTing文本时的连接需要指定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

对于TruncationQuestion Marks,数据丢失.

对于Mojibake/Double Encoding...

Black Diamonds美元...

这里列出了Fixes个.(针对5种不同情况的5种不同修复方法;仔细挑选):http://mysql.rjweb.org/doc.php/charcoll#fixes_for_various_cases

Mysql相关问答推荐

SQL Store Procedure Throwing [42000][1064]您在EXECUTE stat USING声明上的SQL语法中有错误

try 使用TypeORM创建新表时出现SQL语法错误

计算男生的人数和女生的人数.学生是有入学记录的人

从表中 Select 具有不同顺序的列

根据名称将值从一个字段复制到不同记录的同一字段

带有 JOIN 和 WHERE 子句的 INSERT 语句

计算同一个表中的两列,然后将两者都算作总数

将时间戳四舍五入到最接近的半小时而不遗漏丢失的数据

Next-key lock explication - 范围的主键

如何查找列的所有值都相同的行?

如何从具有第一行列值的表中 Select 客户的最新记录

如何获取从开始时间到结束时间的所有正在运行的作业(job)的总和?

MySQL如何在小时和分钟之间 Select 时间

MySQL 8 - MBRContains 不使用空间索引

Python MYSQL 更新语句

从 MYSQL 查询中计算列的平均值

如何从 MySQL Workbench 中的图表生成 SQL 脚本?

如何使用 XML_LOAD() 将 XML 文件导入 MySQL 数据库表;功能

如何从命令行调用带有参数的mysql存储过程?

为什么在 MySQL 中使用外键约束?