我有mysql数据库(不是我的)。在这个数据库中,所有编码都设置为utf-8,并且我使用charset utf-8连接。但是,当我尝试从数据库中读取时,我得到了这个:
×¢×?ק 1 בית ×ª×•×’× ×” העוסק במספר שפות ×ª×•×›× ×” × × ×œ× ×œ×¤× ×•×ª ×חרי 12 בלילה ..
我应该得到什么:
עסק 1 בית תוגנה העוסק במספר שפות תוכנה נא לא לפנות אחרי 12 בלילה ..
当我从phpmyadmin看时,我有同样的事情(pma中的连接是utf-8)。 我知道数据应该是希伯来语。有人知道如何解决这些问题吗?
答案 0 :(得分:0)
您似乎拥有被视为Windows-1252并随后转换为UTF-8的UTF-8数据(有时称为“双重编码”)。
您需要确定的第一件事是转换发生的阶段:在数据保存在表中之前,还是在您尝试检索数据时?最简单的方法通常是SELECT HEX(the_column) FROM the_table WHERE ...
并手动检查当前存储的字节编码:
如果对于上面的数据,您会看到C397C2A9...
,那么数据会被错误地存储(数据插入时错误的connection character set是最常见的罪魁祸首);可以按如下方式进行更正(小心使用足够长度的数据类型代替TEXT
和BLOB
):
撤消导致数据损坏的从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。