将mysql表从latin1转换为utf8

时间:2010-11-01 16:04:36

标签: mysql utf-8 collation latin1 mysql-error-1062

我正在尝试将一些mysql表从latin1转换为utf8。我正在使用以下命令,这似乎主要起作用。

ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

但是,在一个表上,我收到有关重复键输入的错误。这是由“名称”字段上的唯一索引引起的。在转换为utf8时,似乎任何“特殊”字符都被索引为它们的直接英语等价物。例如,已存在名称字段值为“Dru”的记录。转换为utf8时,带有“Drü”的记录被视为重复记录。与“帕特里克”和“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

2 个答案:

答案 0 :(得分:20)

字符串'Drü''Dru'评估相同的原因是在utf8_general_ci整理中,它们被视为“相同”。字符集的归类的目的是提供一组关于字符串何时相同,何时排在另一个之前的规则,依此类推。

如果您需要一组不同的比较规则,则需要选择其他排序规则。您可以通过发出utf8来查看SHOW COLLATION LIKE 'utf8%'字符集的可用归类。有许多用于文本的排序规则,主要是特定语言;还有utf8_bin校对,它将所有字符串作为二进制字符串进行比较(即将它们作为0和1的序列进行比较)。

答案 1 :(得分:3)

UTF8_GENERAL_CI对重音不敏感。

使用UTF8_BIN或特定语言的排序规则。