mxd*_*dsp 4 mysql sql encoding diacritics primary-key
在 MySQL 中有一个区分重音的主键。
我有一个独特的词表,所以我使用这个词本身作为主键(顺便说一下,如果有人可以给我一个建议,我不知道它是否是一个好的设计/实践)。
我需要该字段对重音(以及为什么不区分大小写)敏感,因为它必须区分,例如,'demandé'和'demande',法语动词“需求者”的两个不同屈折。我在数据库中存储重音词没有任何问题。我只是无法插入两个在无重音时相同的重音字符串。
尝试'demandé'使用以下查询创建行时:
INSERT INTO `corpus`.`token` (`name_token`) VALUES ('demandé');
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
ERROR 1062: 1062: Duplicate entry 'demandé' for key 'PRIMARY'
Run Code Online (Sandbox Code Playgroud)
解决方案 在表声明中使用“collate utf8_general_ci”
SELECT * FROM corpus.token WHERE name_token = 'demandé' COLLATE utf8_bin 解决方案 使用'collate utf8_bin'和 WHERE 语句
我发现我可以通过使用BINARY关键字来实现这一点(请参阅此sqlFiddle)。collate和 和有binary什么区别?
我可以保留其他表的任何更改吗?(反正我得重建那个表,因为它有点乱)
我对 MySQL 中的编码不太满意。我对该数据库中的编码还没有任何问题(我有点幸运,因为我的数据可能并不总是使用相同的编码......而且我无能为力)。我有一种感觉,对“重音敏感”问题的任何修改都可能会导致其他查询或数据完整性出现一些编码问题。我有必要担心吗?
数据库创建:
CREATE DATABASE corpus DEFAULT CHARACTER SET utf8;
Run Code Online (Sandbox Code Playgroud)
唯一词表:
CREATE TABLE token (name_token VARCHAR(50), freq INTEGER, CONSTRAINT pk_token PRIMARY KEY (name_token))
Run Code Online (Sandbox Code Playgroud)
查询
SELECT * FROM corpus.token WHERE name_token = 'demande';
SELECT * FROM corpus.token WHERE name_token = 'demandé';
Run Code Online (Sandbox Code Playgroud)
两者都返回同一行:
demande
Run Code Online (Sandbox Code Playgroud)
整理。你有两个选择,而不是三个:
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)
)
Run Code Online (Sandbox Code Playgroud)
不要即时更改排序规则。如果排序规则在name以下位置不同,则不会使用索引(即会很慢):
WHERE name = ... COLLATE ...
Run Code Online (Sandbox Code Playgroud)
二进制。该数据类型 BINARY,VARBINARY并且BLOB都非常喜欢CHAR,VARCHAR和TEXT用COLLATE ..._bin。也许唯一的区别是文本将被检查是否有效 utf8 存储在 a 中VARCHAR ... COLLATE ..._bin,但在存储到VARBINARY.... 比较(WHERE,ORDER BY等)将相同;也就是说,只需比较位,不要进行大小写折叠或重音剥离等。