我有mysql数据库(不是我的)。在此数据库中,所有编码均设置为utf-8,我将其与charset utf-8连接。但是,当我尝试从数据库中读取时,得到以下信息:

×¢×?ק1
×'יתתו×'×ההעוסק×'×ž×¡×¤×¨×©×¤×•×ª×ª×•×›× ×”
××××××××××××××-רי12גלילה ..


我应该得到什么:

עסק1
ביתתוגנההעוסקבמספרשפותתוכנה
12אלאלפנותאחרי12בלילה..


当我从phpmyadmin看时,我有同样的事情(pma中的连接是utf-8)。
我知道数据应该在希伯来语中。有人知道如何解决这些问题?

最佳答案

您似乎拥有被视为Windows-1252且随后转换为UTF-8的UTF-8数据(有时称为“双重编码”)。

您需要确定的第一件事是转换是在什么阶段进行的:在将数据保存到表中之前还是在尝试检索数据时?最简单的方法通常是SELECT HEX(the_column) FROM the_table WHERE ...并手动检查当前存储的字节编码:


如果对于上述数据,您看到C397C2A9...,则该数据被错误地存储(数据插入时错误的connection character set是最常见的罪魁祸首);可以按以下方式更正(小心使用足够长的数据类型来代替TEXTBLOB):


撤消从Windows-1252到导致数据损坏的UTF-8的转换:

ALTER TABLE the_table MODIFY the_column TEXT CHARACTER SET latin1;

删除错误的编码元数据:

ALTER TABLE the_table MODIFY the_column BLOB;

添加更正的编码元数据:

ALTER TABLE the_table MODIFY the_column TEXT CHARACTER SET utf8;



sqlfiddle上查看。

注意将来要正确插入任何数据,否则表将以某种方式部分编码,部分以另一种方式编码(尝试和修复可能是一场噩梦)。

如果您无法修改数据库架构,则可以使用CONVERT(BINARY CONVERT(the_column USING latin1) USING utf8)将记录实时转换为正确的编码(请参见sqlfiddle),但是我强烈建议您尽可能修复数据库。让它包含损坏的数据。
但是,如果看到D7A2D73F...,则数据将正确存储,并且在检索数据时会发生损坏。您将必须执行进一步的测试以找出确切原因。请参见UTF-8 all the way through以获取指导。

10-08 06:33
查看更多