想要的结果:
在 MySQL 中有一个区分重音的主键。
我有一个独特的词表,所以我使用这个词本身作为主键(顺便说一下,如果有人可以给我一个建议,我不知道它是否是一个好的设计/实践)。
我需要该字段对重音(以及为什么不区分大小写)敏感,因为它必须区分,例如, 'demandé'
和 'demande'
,法语动词“需求者”的两个不同屈折。我在数据库中存储重音词没有任何问题。我只是无法插入两个在无重音时相同的重音字符串。
错误 :
尝试使用以下查询创建 'demandé'
行时:
INSERT INTO `corpus`.`token` (`name_token`) VALUES ('demandé');
我收到此错误:
ERROR 1062: 1062: Duplicate entry 'demandé' for key 'PRIMARY'
问题 :
解决方案 using 'collate utf8_general_ci' 在表声明中
SELECT * FROM corpus.token WHERE name_token = 'demandé' COLLATE utf8_bin
解决方案 using 'collate utf8_bin' 与 WHERE 语句
BINARY
关键字来实现这一点(参见 sqlFiddle )。 collate
和 binary
有什么区别? 一步步 :
数据库创建:
CREATE DATABASE corpus DEFAULT CHARACTER SET utf8;
唯一词表:
CREATE TABLE token (name_token VARCHAR(50), freq INTEGER, CONSTRAINT pk_token PRIMARY KEY (name_token))
查询
SELECT * FROM corpus.token WHERE name_token = 'demande';
SELECT * FROM corpus.token WHERE name_token = 'demandé';
两者都返回同一行:
demande
最佳答案
排序规则 。你有两个选择,而不是三个:utf8_bin
将所有这些视为不同的: demandé
和 demande
和 Demandé
。utf8_..._ci
(通常为 utf8_general_ci
或 utf8_unicode_ci
)将所有这些视为相同: demandé
和 demande
和 Demandé
。
如果您只需要区分大小写( demandé
= demande
,但都不匹配 Demandé
),那么您就不走运了。
如果您只想要重音敏感度( demandé
= Demandé
,但都不匹配 demande
),那么您就不走运了。
声明 。做任何你选择的事情的最佳方式:
CREATE TABLE (
name VARCHAR(...) CHARACTER SET utf8 COLLATE utf8_... NOT NULL,
...
PRIMARY KEY(name)
)
不要即时更改排序规则 。如果
name
中的排序规则不同,则不会使用索引(即会很慢):WHERE name = ... COLLATE ...
二进制 。数据类型
BINARY
、 VARBINARY
和 BLOB
与 CHAR
、 VARCHAR
和 TEXT
与 COLLATE ..._bin
非常相似。也许唯一的区别是文本将被检查存储在 VARCHAR ... COLLATE ..._bin
中的有效 utf8,但在存储到 VARBINARY...
时不会被检查。比较( WHERE
、 ORDER BY
等)将相同;也就是说,只需比较位,不要进行大小写折叠或重音剥离等。