当前位置: 首页 > 面试题库 >

在MySQL中使用重音敏感主键

殳飞扬
2023-03-14
问题内容

所需结果:

在MySQL中具有重音敏感的主键。

我有一个独特的单词表,所以我将单词本身用作主键(顺便说一句,如果有人可以给我一些建议,我不知道它是否是一个好的设计/实践)。

我需要使该字段具有重音(为什么不区分大小写),因为它必须区分法语动词“
demander”的两个不同的变体,例如'demand茅''demande'。我在数据库中存储重音词没有任何问题。我只是无法插入没有重音时相同的两个重音字符字符串。

错误 :

尝试'demand茅'使用以下查询创建行时:

INSERT INTO `corpus`.`token` (`name_token`) VALUES ('demand茅');

我收到此错误:

ERROR 1062: 1062: Duplicate entry 'demand茅' for key 'PRIMARY'

问题 :

  • 为了在该表中具有两个“ demande”和“ demand茅”不同的唯一主键,应在过程中的哪个位置进行修改?

  • 我发现我可以通过使用BINARYKeyword来实现这一点(请参阅此sqlFiddle)。collate和之间有什么区别binary

  • 我可以保留其他表的任何更改吗?(无论如何,我都必须重建该表,因为它有点杂乱无章)

  • 我对使用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 ...

BINARY 。该 数据类型
BINARYVARBINARY并且BLOB都非常喜欢CHARVARCHARTEXTCOLLATE ..._bin。也许唯一的区别是将检查文本中是否存储了有效的utf8 VARCHAR ... COLLATE ..._bin,但存储到中时将不对其进行检查VARBINARY...比较WHEREORDER BY等)将是相同的;也就是说,只需比较这些位,不要进行大小写折叠或重音剥离等。



 类似资料:
  • 问题内容: 我有一个带有utf8一般ci排序规则的MySQL表。在表中,我可以看到两个条目: 阿巴德 阿巴德 我正在使用如下查询: 查询结果给出两个词: 阿巴德 阿巴德 有没有办法表明我只希望MySQL找到带重音的单词?我希望查询仅返回 阿巴德 我也尝试过以下查询: 它没有给我任何结果。感谢您的帮助。 问题答案: 如果您对该字段的搜索始终对重音敏感,则将该字段的排序规则声明为utf8_bin(这将

  • 问题内容: 有什么方法可以使搜索查询的重音不敏感吗? 列和表的排序规则是utf8_polish_ci,我不想更改它们。 例句:toruń 它找不到“toruń”。我怎样才能做到这一点? 问题答案: 您可以在运行时在sql查询中更改排序规则, 但是请注意,在运行时即时更改排序规则会放弃mysql使用索引的可能性,因此大型表的性能可能很糟糕。 或者,您可以将列复制到另一列,例如,但是更改其排序规则。这

  • 问题内容: 我是Elasticsearch新手。 可以说我们有一个这样的类: 我们有2个文档,其名称分别为 “Ayşe” 和 “ Ayse” 。 现在, 我希望能够存储带有重音符号的名称,但是当我搜索时希望能够将不重音符号查询的结果作为重音敏感结果 。 例如:当我搜索 “ Ayse” 或 “Ayşe”时 ,它应同时返回存储的 “Ayşe”和“ Ayse” (带有重音符号)。 现在,当我搜索“ Ay

  • 我正在使用Hibernate Search/Lucene Intégration开发一个J2E应用程序。我索引文档(和其他实体),并希望对其进行不区分重音的搜索(内容和类的字段)。 这样做好吗?是否没有param或conf属性让FrenchAnalyzer忽略重音? 谢谢

  • 问题内容: 我有一个MySQL数据库,其单词包含西班牙语(áéíóú)的重音。我想知道是否有任何方法可以进行变音符号不敏感搜索。例如,如果我搜索“ lapiz”(不带重音),我想从数据库中获取包含“lápiz”一词的结果。我当前执行查询的方式如下: 这是一家在线商店,所以我不知道人们会搜索什么……“ lapiz”只是一个例子。 替代文字http://www.freeimagehosting.net

  • 我的PHP网站有以下内容: > 启用SSL Cookie: 传输时的密码SHA512,然后是password_hash(),最后是PASSWORD_BCRYPT 我现在希望使用AES_Encrypt函数加密敏感数据,方法是将用于加密和解密的$key存储在webroot目录之外。 这可能会存储病人的数据,我所拥有的是否足够安全? 问题: 当您插入/更新时,您是如何清理输入的?如果您使用的是准备好的语