是否存在MySQL utf8排序规则,不会将重音字符混为一谈?

时间:2011-07-09 03:13:38

标签: mysql utf-8 collation

我有一个utf8表,我正在存储数据:

+-------+--------+
| name  | gender |
+-------+--------+
| ESMÉ  | F      | 
| ESME  | F      | 
+-------+--------+

但是,当我尝试在(名称,性别)上添加唯一键时,这两行违反了约束。我已经能够使用utf8_bin整理实现我的目标,但后来我失去了不区分大小写。

所以我猜我真正想要的是一种存储utf8数据的方法,但是在我的唯一键中不会将重音和非重音字符视为等效字符。

2 个答案:

答案 0 :(得分:1)

我认为你想要的不是直接的。 排序规则决定了日期的排序和比较方式。对于您的密钥,您希望将两个值视为不同,但在您的正常比较中,您希望将它们视为相同。

虽然在指定查询时有一个技巧:只需将结果转换为utf8而不指定排序规则。这将转换结果并将排序规则设置回默认值。

以下示例显示了我的意思:

mysql> show create table test_col;
+----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table    | Create Table                                                                                                                                                        |
+----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| test_col | CREATE TABLE `test_col` (
  `name` varchar(200) COLLATE utf8_bin DEFAULT NULL,
  UNIQUE KEY `ixuniq` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin |
+----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> insert into test_col (name) values ('Y'),(unhex('c39d'));Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from test_col;
+------+
| name |
+------+
| Y    |
| Ý   |
+------+
2 rows in set (0.00 sec)

mysql> select * from test_col where name='Y';
+------+
| name |
+------+
| Y    |
+------+
1 row in set (0.00 sec)

mysql> select * from test_col where convert(name using 'utf8')='y';+------+
| name |
+------+
| Y    |
| Ý   |
+------+
2 rows in set (0.00 sec)

答案 1 :(得分:0)

我有完全相同的问题,整理存在于拉丁语中,它是latin1_general_ci但在utf8中不存在。 你有3个解决方案: