将非utf8数据库转换为utf-8
Converting non-utf8 database to utf-8
我长期使用 database/connection 编码错误,导致数据库中的希伯来语字符显示为未知语言字符,如下示例所示:
我想 re-import/change 数据库将错误编码的字符插入到正确的编码字符中,这样希伯来文字符将显示为希伯来文字符,而不是像 *"× ×תה מסכי×,×× ×©×™× ×ž×¦×™×¢×™× ×œ×™ כמה ×”× "*
这样的未知解析
郑重声明,当我用 php 显示此未知字符 sql 数据时 - 它显示为希伯来语。当我尝试从 phpMyAdmin 面板访问它时 - 它显示为乱码(这些未知字符)。
虽然数据库中已经插入了一些数据,但有什么办法可以修复它吗?
我不确定您是否可以对已存储在数据库中的数据执行任何操作。但是,您可以通过确保具有正确的字符集和排序规则来正确导入希伯来语数据。
- 数据库排序规则必须是
utf8_general_ci
- table 与希伯来语的排序规则必须是
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 ('שלום');
感觉就像 "double-encoded" 希伯来语字符串。
这部分恢复了文本:
UNHEX(HEX(CONVERT('× ×תה מסכי×,××' USING latin1)))
--> '� �תה מסכי�,��
我不知道是什么导致了 �
符号。
请对某些单元格执行 SELECT col, HEX(col) FROM ... WHERE ...;
。如果正确存储,我希望 שלום
给出十六进制 D7A9D79CD795D79D
。对于 "double encoding",我希望 C397C2A9C397C593C397E280A2C397C29D
。
请提供那个SELECT的输出,然后我会研究如何恢复数据。
编辑
这是我认为发生的事情。
- 客户端的字符编码为utf8;和
SET NAMES latin1
谎称客户端有 latin1 编码;和
- table 中的列已声明
CHARACTER SET utf8
。
yod作为信件没有跳出来,等了好久才看到。 CONVERT(BINARY(CONVERT('×™×™123' USING latin1)) USING utf8)
-->əə123
所以,我认为那个表达式会清理文本。但要小心;在 'fixing' 整个 table.
之前尝试几行
UPDATE table SET col = CONVERT(BINARY(CONVERT(col USING latin1)) USING utf8) WHERE ...;
如果这不起作用,这里 4 fixes for double-encoding 可能等效,也可能不等效。 (注:BINARY(xx)
大概等同于 CONVERT(xx USING binary)
。)
我长期使用 database/connection 编码错误,导致数据库中的希伯来语字符显示为未知语言字符,如下示例所示:
我想 re-import/change 数据库将错误编码的字符插入到正确的编码字符中,这样希伯来文字符将显示为希伯来文字符,而不是像 *"× ×תה מסכי×,×× ×©×™× ×ž×¦×™×¢×™× ×œ×™ כמה ×”× "*
这样的未知解析
郑重声明,当我用 php 显示此未知字符 sql 数据时 - 它显示为希伯来语。当我尝试从 phpMyAdmin 面板访问它时 - 它显示为乱码(这些未知字符)。
虽然数据库中已经插入了一些数据,但有什么办法可以修复它吗?
我不确定您是否可以对已存储在数据库中的数据执行任何操作。但是,您可以通过确保具有正确的字符集和排序规则来正确导入希伯来语数据。
- 数据库排序规则必须是
utf8_general_ci
- table 与希伯来语的排序规则必须是
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 ('שלום');
感觉就像 "double-encoded" 希伯来语字符串。
这部分恢复了文本:
UNHEX(HEX(CONVERT('× ×תה מסכי×,××' USING latin1)))
--> '� �תה מסכי�,��
我不知道是什么导致了 �
符号。
请对某些单元格执行 SELECT col, HEX(col) FROM ... WHERE ...;
。如果正确存储,我希望 שלום
给出十六进制 D7A9D79CD795D79D
。对于 "double encoding",我希望 C397C2A9C397C593C397E280A2C397C29D
。
请提供那个SELECT的输出,然后我会研究如何恢复数据。
编辑
这是我认为发生的事情。
- 客户端的字符编码为utf8;和
SET NAMES latin1
谎称客户端有 latin1 编码;和- table 中的列已声明
CHARACTER SET utf8
。
yod作为信件没有跳出来,等了好久才看到。 CONVERT(BINARY(CONVERT('×™×™123' USING latin1)) USING utf8)
-->əə123
所以,我认为那个表达式会清理文本。但要小心;在 'fixing' 整个 table.
之前尝试几行UPDATE table SET col = CONVERT(BINARY(CONVERT(col USING latin1)) USING utf8) WHERE ...;
如果这不起作用,这里 4 fixes for double-encoding 可能等效,也可能不等效。 (注:BINARY(xx)
大概等同于 CONVERT(xx USING binary)
。)