想要的结果:

在 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 )。 collatebinary 有什么区别?
  • 我可以保留其他表的任何更改吗? (反正我得重建那个表,因为它有点乱)
  • 我不太习惯在 MySQL 中进行编码。我对该数据库中的编码还没有任何问题(我有点幸运,因为我的数据可能并不总是使用相同的编码......而且我无能为力)。我有一种感觉,对“重音敏感”问题的任何修改都可能会导致其他查询或数据完整性出现一些编码问题。我有必要担心吗?

  • 一步步 :

    数据库创建:
    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édemandeDemandé
    utf8_..._ci(通常为 utf8_general_ciutf8_unicode_ci )将所有这些视为相同: demandédemandeDemandé

    如果您只需要区分大小写( demandé = demande ,但都不匹配 Demandé ),那么您就不走运了。

    如果您只想要重音敏感度( demandé = Demandé ,但都不匹配 demande ),那么您就不走运了。

    声明 。做任何你选择的事情的最佳方式:

    CREATE TABLE (
        name VARCHAR(...)  CHARACTER SET utf8  COLLATE utf8_...  NOT NULL,
        ...
        PRIMARY KEY(name)
    )
    

    不要即时更改排序规则 。如果 name 中的排序规则不同,则不会使用索引(即会很慢):
    WHERE name = ... COLLATE ...
    

    二进制 。数据类型 BINARYVARBINARYBLOBCHARVARCHARTEXTCOLLATE ..._bin 非常相似。也许唯一的区别是文本将被检查存储在 VARCHAR ... COLLATE ..._bin 中的有效 utf8,但在存储到 VARBINARY... 时不会被检查。比较( WHEREORDER BY 等)将相同;也就是说,只需比较位,不要进行大小写折叠或重音剥离等。

    10-07 17:47