6

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

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

因此,综上所述,我需要一些解决方案,该解决方案不会影响命中此列的许多现有查询中的默认大小写敏感度,但可以让我添加仅相差一个变音符号的单词。想法?如果必须,我将仅将唯一键约束切换为 utf8_bin,但我宁愿不这样做,因为我从不希望表中有两个仅因大小写而异的东西。

4

2 回答 2

1

您不必在这里重新发明爆胎(重新发明轮子)。

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

utf8_spanish_ci(现代西班牙语)和 utf8_spanish2_ci(传统西班牙语)

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

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

于 2012-06-13T00:47:47.160 回答
0

我能想到的唯一一件事(没有找到适合您需要的排序规则)是在应用程序层(MySQL 之外)进行更改,以处理差异化。

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

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

于 2012-06-13T00:26:22.027 回答