【问题标题】:Converting non-utf8 database to utf-8将非 utf8 数据库转换为 utf-8
【发布时间】:2015-06-12 21:25:29
【问题描述】:

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

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

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

虽然数据库中已经插入了一些数据,但有什么办法可以修复它?

【问题讨论】:

    标签: mysql database encoding utf-8


    【解决方案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) 相同。)

    【讨论】:

    • 可能是复制/粘贴省略了一些无法显示的字符。如果没有实际字节的十六进制转储,很难可靠地重建输入。这是一个非常古老的问题,但 OP 或许应该咨询character-encoding tag wiki 以了解如何包含有用的诊断信息。
    • 希望有一些无法打印的内容。然后我们可以看看它是否是一个直接的双重编码,此时可以提出一个解决方案。
    • 好的。我一直在使用您在某些希伯来语单元格上提供的上述十六进制查询 - 这是输出:s24.postimg.org/qzc0f1y11/cells.png - 似乎是双重编码的。这个数据库非常大(大约 100-200mb),我真的很想找到一种方法来使这些数据正常编码。
    • 这是完美的工作!非常感谢,现在我可以正确使用我编码错误的数据库了。感谢您的帮助和出色的解决方案。
    • 我应该强调做SET NAMES utf8;(或等效的,例如mysqli_set_charset('utf8'))以防止将来的INSERTs搞砸。
    【解决方案2】:

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

    1. 数据库排序规则必须是utf8_general_ci
    2. 表与希伯来语的排序规则必须是utf8_general_ci

    例如:

    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 ('שלום');

    【讨论】:

    • 遗憾的是,我有 100MB~ 数据库,其中已经存储了如上所示的数据(未知字符),我正在寻找一种方法来修复它并将其转换回来。
    • 正确识别当前编码后,您就可以转换数据库了。 stackoverflow.com/questions/6115612/… 是一个起点,但鉴于您的困境,请参阅链接的问题和工具。也许您必须导出到文本转储,转换文本,使用正确设置创建一个空数据库,然后导入转换后的文本。
    猜你喜欢
    • 1970-01-01
    • 2022-11-12
    • 2010-11-12
    • 2012-04-23
    • 1970-01-01
    • 2011-02-02
    • 1970-01-01
    • 2015-09-21
    相关资源
    最近更新 更多