我有一个utf8表,我正在存储数据:
+-------+--------+
| name | gender |
+-------+--------+
| ESMÉ | F |
| ESME | F |
+-------+--------+
但是,当我尝试在(名称,性别)上添加唯一键时,这两行违反了约束。我已经能够使用utf8_bin整理实现我的目标,但后来我失去了不区分大小写。
所以我猜我真正想要的是一种存储utf8数据的方法,但是在我的唯一键中不会将重音和非重音字符视为等效字符。
答案 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个解决方案: