MySQL 不区分大小写但区分重音 UTF8 唯一键

问题描述 投票:0回答:2

我知道关于 SF 有很多类似的问题,但我认为我的不同足以保证一个新问题。我有一个表,其中有一个列作为 utf8 和 utf8_unicode_ci。它还在此列上有一个唯一的键以及标记语言代码的另一列。列中的数据采用多种不同的文字(带有不同口音的拉丁文、中文和俄文等)。

问题是我有时会想输入两个具有不同含义的单词,这些单词只是变音符号不同(即西班牙语 ano 与 año)。由于 utf8_unicode_ci 不区分大小写和重音,它认为这些是相同的,只会让我输入一个。太糟糕了。理想情况下,我只是将整个列切换到一些不区分大小写但区分重音的排序规则,但这似乎不存在。许多不同的东西都使用这个列,所以我宁愿不将列的默认排序规则更改为 utf8_bin,以免因区分大小写而弄乱东西。

所以,综上所述,我需要一些解决方案,它不会影响命中此列的许多现有查询中的默认大小写敏感性,但会让我添加仅区别于变音符号的单词。想法?如果必须的话,我会只将唯一键约束切换到 utf8_bin,但我宁愿不这样做,因为我从不希望表中的两件事只因大小写不同而不同。

mysql unicode utf-8 collation
2个回答
1
投票

你不必在这里重新发明漏气的轮胎(重新发明轮子)。

MySQL中有两种西班牙语排序规则:

utf8_spanish_ci(现代西班牙语)和 utf8_spanish2_ci(繁体西班牙语)

这些人很懂这门语言,知道 N 和 n 应该放在一起,但是 Ñ 和 ñ 是 N 和 O 之间的不同字母。在西班牙语中,Ñ 实际上是不同的字母,而不是重音。

将您的列排序规则设置为 utf8_spanish_ci,一切都会按您想要的方式工作。


0
投票

我唯一能想到的(没有找到适合您需要的排序规则)是在应用程序层(MySQL 之外)改变一些东西来处理差异化。

例如,由于您不关心大小写,您可以通过编程方式做一些事情来降低数据库中所有行的大小写。然后将排序规则更改为utf8_bin。

然后你可以在应用程序中,在输入数据库之前将所有内容转换为小写(我猜这不会影响变音符号)。这样,如果人们尝试输入多个案例,你仍然会出错,你只需要更改几行代码来预先准备进入表格的东西,你就不会有变音符号问题。

© www.soinside.com 2019 - 2024. All rights reserved.