如何确定 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
,这是一个非常简单的更改,因为utf8mb4
是utf8
的超集:将连接选项从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)
。西欧重音字符将是
更多讨论:Trouble with UTF-8 characters; what I see is not what I stored
【讨论】:
以上是关于如何确定 utf8 数据编码错误并在 MySql 中更正?的主要内容,如果未能解决你的问题,请参考以下文章