我有一個希伯來語新聞網站。數據庫中的所有希伯來語數據都以latin1_swedish_ci編碼存儲。如何將希伯來語數據庫從latin1_swedish_ci轉換爲utf8?
除了通過phpMyAdmin轉換列編碼之外,我需要轉換數據本身。
有沒有簡單的方法來做到這一點?
丹尼爾。
我有一個希伯來語新聞網站。數據庫中的所有希伯來語數據都以latin1_swedish_ci編碼存儲。如何將希伯來語數據庫從latin1_swedish_ci轉換爲utf8?
除了通過phpMyAdmin轉換列編碼之外,我需要轉換數據本身。
有沒有簡單的方法來做到這一點?
丹尼爾。
由於latin1
不包含希伯來字符,因此您有一種特殊的混亂形式。但是,它可以是「固定的」。但首先,我們需要知道在執行INSERTs
時你有什麼編碼。也許hebrew
,或許utf8
?
爲了找到答案,做
SELECT col, HEX(col) FROM tbl WHERE ...
例如:א
,在UTF8是十六進制D790
;在hebrew
,這將是E0
如果文字是UTF8(主要是Dxxx表示),我們可以做2步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 ...;
3個步驟中的前2個步驟取決於編碼是什麼; 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 |
+------+--------+-----------+----------------+
在沒有你的情況下測試不同有什麼辦法?
它在utf8中(轉向Ð到D790)。 但是第二行: ALTER TABLE'pages' MODIFY COLUMN'title' VARCHAR(255)CHARACTER SET utf8; 留下了一個空白欄。 – Daniel
查看更新.... –
latin1是否可以包含希伯來字符? – Evert