哪个mysql utf8排序规则用于来自latin1的数据

时间:2011-06-24 13:40:34

标签: mysql encoding utf-8

我在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可以接受所有内容而不会出现重复错误,但我无法使用它,因为它区分大小写。 我错过了什么吗?

注意:有些表的行数超过十几万,因此性能是一个因素。

2 个答案:

答案 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     |
| ÿ     |
| Ÿ     |
+-------+