将 mysql 表从 latin1 转换为 utf8

Posted

技术标签:

【中文标题】将 mysql 表从 latin1 转换为 utf8【英文标题】:Converting mysql tables from latin1 to utf8 【发布时间】:2011-05-03 12:11:22 【问题描述】:

我正在尝试将一些 mysql 表从 latin1 转换为 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

【问题讨论】:

【参考方案1】:

UTF8_GENERAL_CI 不区分重音。

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

【讨论】:

【参考方案2】:

字符串'Drü''Dru' 评估为相同的原因是在utf8_general_ci 排序规则中,它们算作“相同”。字符集的排序规则 的目的是提供一组规则,说明字符串何时相同、何时排序在另一个之前等等。

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

【讨论】:

以上是关于将 mysql 表从 latin1 转换为 utf8的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 将 latin1 数据转换为 UTF8

将 UTF8 表上的 latin1 字符转换为 UTF8

MySQL Convert latin1 to utf8, cp1252 0x80-0x9F 错误

Mysql 将排序规则从 latin1_swedish_ci 更改为 utf8mb4_bin

不同子系统采用不同MySQL编码LATIN1和UTF8的兼容

mysql中latin1编码中文转utf8