如何将希伯来语数据库从latin1_swedish_ci转换为utf8?

时间:2015-10-06 14:24:27

标签: php mysql utf-8 character-encoding

我有一个希伯来语的新闻网站。数据库中的所有希伯来语数据都存储在latin1_swedish_ci编码中。

除了通过phpMyAdmin转换列编码之外,我还需要转换数据本身。

有没有简单的方法可以做到这一点?

丹尼尔。

1 个答案:

答案 0 :(得分:0)

由于latin1不包含希伯来字符,因此您有一种特殊的混乱形式。但是,它可以修复"。但首先,我们需要知道在执行INSERTs时您使用的编码。也许是hebrew,也许是utf8

要了解,请执行

SELECT col, HEX(col) FROM tbl WHERE ...

例如:א,在utf8中将为十六进制D790;在hebrew中,它将是E0

如果文本是utf8(主要是Dxxx),我们可以执行两步ALTER来修复它:

ALTER TABLE Tbl MODIFY COLUMN col VARBINARY(...) ...;
ALTER TABLE Tbl MODIFY COLUMN col VARCHAR(...) ... CHARACTER SET utf8 ...;

如果hebrew,那么我认为需要3个步骤:

ALTER TABLE Tbl MODIFY COLUMN col VARBINARY(...) ...;
ALTER TABLE Tbl MODIFY COLUMN col VARCHAR(...) ... CHARACTER SET hebrew ...;
ALTER TABLE Tbl MODIFY COLUMN col VARCHAR(...) ... CHARACTER SET utf8 ...;

前2个(3个)步骤不关于编码是什么; 3 ALTER转换列定义和字节(E0 - > D790等)。

<强>更新

CREATE TABLE h2u ( c VARCHAR(9) CHARACTER SET latin1 );
INSERT INTO h2u (c) VALUE (UNHEX('D790'));
SELECT c, HEX(c), LENGTH(c), CHAR_LENGTH(c) FROM h2u;
+------+--------+-----------+----------------+
| c    | HEX(c) | LENGTH(c) | CHAR_LENGTH(c) |
+------+--------+-----------+----------------+
| ×   | D790   |         2 |              2 |
+------+--------+-----------+----------------+

# Now to fix it...
ALTER TABLE h2u MODIFY COLUMN c VARBINARY(9);
ALTER TABLE h2u MODIFY COLUMN c VARCHAR(9) CHARACTER SET utf8;
SELECT c, HEX(c), LENGTH(c), CHAR_LENGTH(c) FROM h2u;
+------+--------+-----------+----------------+
| c    | HEX(c) | LENGTH(c) | CHAR_LENGTH(c) |
+------+--------+-----------+----------------+
| א    | D790   |         2 |              1 |
+------+--------+-----------+----------------+

您的测试用例有何不同?