【发布时间】: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 的假设。