从国外数据库发现charset

时间:2013-07-13 12:55:19

标签: php mysql encoding utf-8

我有mysql数据库(不是我的)。在这个数据库中,所有编码都设置为utf-8,并且我使用charset utf-8连接。但是,当我尝试从数据库中读取时,我得到了这个:

×¢×?ק 1
בית ×ª×•×’× ×” העוסק במספר שפות ×ª×•×›× ×” 
× × ×œ× ×œ×¤× ×•×ª ×חרי 12 בלילה ..

我应该得到什么:

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

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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

      ALTER TABLE the_table MODIFY the_column TEXT CHARACTER SET latin1;
      
    2. 删除错误的编码元数据:

      ALTER TABLE the_table MODIFY the_column BLOB;
      
    3. 添加更正的编码元数据:

      ALTER TABLE the_table MODIFY the_column TEXT CHARACTER SET utf8;
      
    4. sqlfiddle上查看。

      请注意以后正确插入任何数据,否则表格将以某种方式部分编码,部分编码在另一种方式中(这可能是尝试修复的噩梦)。

      如果您无法修改数据库架构,可以使用CONVERT(BINARY CONVERT(the_column USING latin1) USING utf8)即时将记录转码为正确的编码(请参阅sqlfiddle),但我强烈建议您您可以在可能的情况下修复数据库,而不是让数据库包含损坏的数据。

    5. 但是,如果您看到D7A2D73F...,那么数据会正确存储,并且在检索数据时会发生损坏;您将不得不进行进一步的测试以确定确切的原因。有关指导,请参阅UTF-8 all the way through