我在latin1格式的mysql中有很多数据,我正在尝试将所有内容转换为utf8,但到目前为止我没有找到正确的排序规则来正确转换它。 一些数据是国际名称,具有很多重音,各种语言的字符和这些字段的主键。 我有一个简单的测试用例,如下所示:
CREATE TABLE utf8_test ( value varchar(30), PRIMARY KEY(value) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_swedish_ci;
INSERT INTO utf8_test VALUES ('e');
INSERT INTO utf8_test VALUES ('é');
INSERT INTO utf8_test VALUES ('è');
INSERT INTO utf8_test VALUES ('ü');
INSERT INTO utf8_test VALUES ('u');
INSERT INTO utf8_test VALUES ('y');
INSERT INTO utf8_test VALUES ('ÿ');
这是一个简单的测试来证明问题,但实际数据不仅限于此。
到目前为止,只有utf8_bin可以接受所有内容而不会出现重复错误,但我无法使用它,因为它区分大小写。 我错过了什么吗?
注意:有些表的行数超过十几万,因此性能是一个因素。
答案 0 :(得分:1)
正确的排序规则取决于源字符集(Latin-1)。它取决于数据来自的语言和区域设置。如果您只是担心确保没有任何字符折叠成另一个字符,那么utf8_bin可能就是这样。
但是,您可能会遇到意外排序,其中字符是根据UTF-8字节值排序的,而不是根据任何特定语言或区域首选项排序。
为了获得不区分大小写的排序规则,您可能需要尝试 utf8_general_ci或utf8_unicode_ci,如UTF-8: General? Bin? Unicode?
中所述修改强> 进一步的研究表明,目前没有可以使用的整理。见http://bugs.mysql.com/bug.php?id=19567。
如何选择这个?将utf8_bin分配给您的列,但是对您的查询应用不同的排序规则(一个可以折叠大小写和重音符号的排序规则)?您不会丢失任何数据,并且您的查询将不区分大小写。如果对重音不敏感的查询不会伤害你,那可能是妥协......
答案 1 :(得分:1)
据我所知,MySQL还没有区分大小写的utf8排序规则,所以utf8_bin
是你唯一的选择。 utf8_bin
区分大小写,并将所有变音符号视为单独的。正如布莱尔康拉德指出的那样,它可能会使排序变得混乱。您可以通过using collate in your SQL statements来解决这个问题,尽管如果您有很多SQL语句,这种方法可能会有问题。
CREATE TABLE `utf8_test` (
`value` varchar(30) COLLATE utf8_bin NOT NULL DEFAULT '',
PRIMARY KEY (`value`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
INSERT INTO utf8_test VALUES ('e');
INSERT INTO utf8_test VALUES ('é');
INSERT INTO utf8_test VALUES ('è');
INSERT INTO utf8_test VALUES ('ü');
INSERT INTO utf8_test VALUES ('u');
INSERT INTO utf8_test VALUES ('y');
INSERT INTO utf8_test VALUES ('ÿ');
INSERT INTO utf8_test VALUES ('E');
INSERT INTO utf8_test VALUES ('É');
INSERT INTO utf8_test VALUES ('È');
INSERT INTO utf8_test VALUES ('Ü');
INSERT INTO utf8_test VALUES ('U');
INSERT INTO utf8_test VALUES ('Y');
INSERT INTO utf8_test VALUES ('Ÿ');
SELECT value FROM utf8_test WHERE value = 'E';
+-------+
| value |
+-------+
| E |
+-------+
SELECT value FROM utf8_test WHERE value COLLATE utf8_unicode_ci = 'E';
+-------+
| value |
+-------+
| E |
| e |
| È |
| É |
| è |
| é |
+-------+
SELECT value FROM utf8_test ORDER BY value;
+-------+
| value |
+-------+
| E |
| U |
| Y |
| e |
| u |
| y |
| È |
| É |
| Ü |
| è |
| é |
| ü |
| ÿ |
| Ÿ |
+-------+
SELECT value FROM utf8_test ORDER BY value COLLATE utf8_unicode_ci;
+-------+
| value |
+-------+
| E |
| é |
| è |
| É |
| È |
| e |
| u |
| Ü |
| U |
| ü |
| y |
| Y |
| ÿ |
| Ÿ |
+-------+