如何确定 utf8 数据编码错误并在 MySql 中更正?

Posted

技术标签:

【中文标题】如何确定 utf8 数据编码错误并在 MySql 中更正?【英文标题】:How can I determine utf8 data encoding error and correct it in MySql? 【发布时间】:2020-07-20 21:52:41 【问题描述】:

我有一个用 Perl 编写的网站表单,可以将多种语言的用户输入保存到 mysql 数据库中。虽然它可以完美地保存和显示所有字符而没有问题,但在 phpMyAdmin 中,字符总是显示错误。但是我忽略了这一点,因为网站显示字符正常。

现在我刚刚将网站移至 VPS,并且数据库似乎对数据强制执行 ut8mb4 编码,因此它现在在网站上显示字符错误。我不是专家,发现整个编码领域很混乱。我的问题是,我该怎么做:

a) 确定我的数据在表中的实际编码方式?

b) 将其正确转换为 utf8mb4 以便在 PHPMyAdmin 和我的网站中正确显示?

所有 html 页面都使用 charset=utf8 声明。 MySQL 连接使用mysql_enable_utf8 => 1。我原始数据库中的表设置为utf8_general_ci 排序规则。原始数据库排序规则(我刚刚注意到)设置为latin1_swedish_ci。新的数据库 AND 表排序规则为 utf8mb4_general_ci。提前致谢。

【问题讨论】:

Re "[how can I]确定我的数据在我的表中实际上是如何编码的?",它是根据字段上指定的编码进行编码的。如果您在 phpMyAdmin 中看到垃圾,那是因为您告诉数据库期望使用一种编码,但使用了不同的编码。如果您在 phpMyAdmin 中看到正确的数据,则一切正常。 如果你的所有东西都使用utf8,这是一个非常简单的更改,因为utf8mb4utf8 的超集:将连接选项从mysql_enable_utf8 => 1 更改为mysql_enable_utf8mb4 => 1,然后更改使用ALTER TABLE t MODIFY col1 VARCHAR(50) CHARACTER SET utf8mb4; 的字段类型。请注意,MySQL 所称的 utf8mb4 就是世界其他地方所称的 UTF-8,因此无需对程序进行其他更改。您只是删除了不会提供字符 >= U+10000 的假设。 【参考方案1】:

SHOW CREATE TABLE 会告诉你桌子的默认 CHARACTER SET。对于覆盖默认值的任何列,该列将指定它的设置。

但是,列中可能有垃圾。 许多用户在将 utf8 字节存储到 latin1 列时遇到了这个问题。这会导致“Mojobake”或“双重编码”。

知道那里实际存储了什么的唯一方法是SELECT HEX(col)。西欧重音字符将是

一个字节用于存储在 latin1 列中的 latin1 字符。 2 个字节的 utf8 字符存储在 1 个 utf8 字符或 2 个 latin1 字符中。 转换两次时“双重编码”的几个字节。

更多讨论:Trouble with UTF-8 characters; what I see is not what I stored

【讨论】:

以上是关于如何确定 utf8 数据编码错误并在 MySql 中更正?的主要内容,如果未能解决你的问题,请参考以下文章

如何在mysql中存取utf8mb4编码的字符?

Mysql 中文乱码(Navicat for MySQL)

如何修改MySQL字符集

如何设置MySQL表的某字段编码为utf8?急!

关于MYSQL数据库编码(Incorrect string value 错误)

如何对mysql中的字符进行编码转换