我有一个为 PHP 应用程序提供服务的数据库,其中存储了非英文字符,例如:çã é
。
以前,该数据库已正确存储和显示这些字符,但在备份和恢复后,其位置上的一些字符在应该显示时已被替换为诸如 çã£
之类的组合
显然这是备份或恢复字符集的疏忽,但是我无法检索数据库以前的良好版本。
此转储文件是数据库的所有剩余部分,并且在文本编辑器中打开时,它还会显示 çã
等组合,而不是 çã
。
我尝试将其中一个表从 utf8_unicode_ci 转换为 latin1_swedish_ci 或反之,但没有效果。
ALTER TABLE test CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE test CONVERT TO CHARACTER SET latin1 COLLATE latin1_swedish_ci;
如何解决这个问题。
谢谢。
注意: PHP 中的 utf8_decode
能够将 á§à£
转换为 ça
,但我会希望从源头上解决这个问题。
更新:我能够查询受影响的表并让它通过以下查询返回正确的字符。
从受影响的表中选择转换(cast(转换(使用latin1的field_name)作为二进制)使用utf8)
更新2:
下面的查询能够将字符转换为其正确的 UTF-8 表示形式。
SELECT convert(cast(convert(field_name using latin1) as binary) using utf8) FROM affectedTable
因此,按照上一个查询中的方法,如果您对每个受影响的表运行以下三个查询,它应该将字符转换为 UTF-8。
ALTER TABLE table CONVERT TO CHARACTER SET latin1;
ALTER TABLE table CONVERT TO CHARACTER SET binary;
ALTER TABLE table CONVERT TO CHARACTER SET utf8;
就是这样,像 ça£
这样的字符将被转换为 ça
等等。
这适用于 Windows 上的 MySQL 5.6.20 - 社区服务器,但不适用于 Linux 上的 MySQL 5.5.42 - 社区服务器。也许有人知道跨版本/操作系统的解决方案。
最佳答案
听起来你表中的数据存储为latin1,但实际上是utf8。
在执行“转换为字符集”时,它通常会尝试将字符从“latin1”基本上转换为“utf8”
要在不更改数据的情况下更改类型,您需要首先将该列转换为二进制列,然后转换为最终目标字符集,这应避免任何实际的字符转换。
这里的文档对此进行了讨论: https://dev.mysql.com/doc/refman/5.5/en/charset-conversion.html
关于MySQL 将表转换为 latin1 不会将外来字符转换为正确的表示形式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30402318/