将非utf8数据库转换为utf-8

时间:2015-06-12 21:25:30

标签: mysql database encoding utf-8

我长时间使用错误编码的数据库/连接,导致数据库中的希伯来语字符显示为未知语言字符,如下例所示:

enter image description here

我想使用插入错误编码的字符重新导入/更改数据库到正确的编码字符,因此希伯来字符将显示为希伯来字符,而不是像*"× ×תה מסכי×,×× ×©×™× ×ž×¦×™×¢×™× ×œ×™ כמה ×”× "*这样的未知解析

对于记录,当我用php显示这个未知字符sql数据时 - 它显示为希伯来语。当我试图从phpMyAdmin面板访问它时 - 它显示为jibrish(这些未知字符)。

有没有办法解决它,虽然数据库中已经插入了一些数据?

2 个答案:

答案 0 :(得分:1)

感觉就像是“双重编码”的希伯来字符串。

这部分恢复了文本:

UNHEX(HEX(CONVERT('× ×תה מסכי×,××' USING latin1))) 
-->  '� �תה מסכי�,�� 

我不知道是什么导致符号。

请为某个单元格执行SELECT col, HEX(col) FROM ... WHERE ...;。如果正确存储,我希望שלום给出十六进制D7A9D79CD795D79D。对于“双重编码”,我希望C397C2A9C397C593C397E280A2C397C29D

请提供该SELECT的输出,然后我将研究如何恢复数据。

修改

这就是我认为发生的事情。

  • 客户端的字符编码为utf8;和
  • SET NAMES latin1声称客户端有latin1编码;和
  • 表格中的列声明为CHARACTER SET utf8

Yod没有像信一样跳出来,所以花了一段时间才看到它。 CONVERT(BINARY(CONVERT('×™×™123' USING latin1)) USING utf8) - >依地语123

所以,我思考该表达式将清理文本。但要小心;在“修复”整个表格之前尝试几行。

UPDATE table SET col = CONVERT(BINARY(CONVERT(col USING latin1)) USING utf8) WHERE ...;

如果这不起作用,这里的4 fixes for double-encoding可能相同或不同。 (注意:BINARY(xx)可能与CONVERT(xx USING binary)相同。)

答案 1 :(得分:0)

我不确定您是否可以对已存储在数据库中的数据执行任何操作。但是,您可以通过确保具有正确的字符集和排序规则来正确导入希伯来语数据。

  1. db collat​​ion必须为utf8_general_ci
  2. 表与希伯来语的整理必须是utf8_general_ci
  3. 例如:

    CREATE DATABASE col CHARACTER SET utf8 COLLATE utf8_general_ci;

    CREATE TABLE `col`.`hebrew` (
      `id` INT NOT NULL AUTO_INCREMENT,
      `heb` VARCHAR(45) NOT NULL,
      PRIMARY KEY (`id`)
      ) CHARACTER SET utf8
      COLLATE utf8_general_ci;
    

    INSERT INTO hebrew(heb) values ('שלום');

    enter image description here