2010-11-01 95 views
16

我想將一些mysql表從拉丁文轉換爲utf8。我正在使用下面的命令,這似乎主要工作。將MySQL表從拉丁文轉換爲utf8

ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; 

但是,在一張桌子上,我得到一個有關重複鍵輸入的錯誤。這是由「名稱」字段上的唯一索引造成的。看起來,轉換爲utf8時,任何「特殊」字符都被索引爲直接英語等值。例如,已經有一個名爲「Dru」的記錄。當轉換爲utf8時,帶有「Drü」的記錄被認爲是重複的。與「Patrick」和「Påtrìçk」相同。

下面是如何重現問題:

CREATE TABLE `example` ( `name` char(20) CHARACTER SET latin1 NOT NULL, 
    PRIMARY KEY (`name`)) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

INSERT INTO example (name) VALUES ('Drü'),('Dru'),('Patrick'),('Påtrìçk'); 

ALTER TABLE example convert to character set utf8 collate utf8_general_ci; 
ERROR 1062 (23000): Duplicate entry 'Dru' for key 1 

回答

20

字符串'Drü''Dru'評價相同的原因是在utf8_general_ci歸類中,它們計爲「相同」。對於字符集,排序規則的目的是爲了提供一組關於字符串何時相同,何時排序在另一個之前的規則,等等。

如果您想要一組不同的比較規則,您需要選擇不同的排序規則。您可以通過發行SHOW COLLATION LIKE 'utf8%'來查看utf8字符集的可用排序規則。有一大堆用於文本的排序規則,主要是用特定的語言;還有utf8_bin排序規則,它將所有字符串作爲二進制字符串進行比較(即將它們作爲0和1的序列進行比較)。

3

UTF8_GENERAL_CI是不區分重音。

使用UTF8_BIN或特定於語言的整理。