2010-11-01 67 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或特定于语言的整理。