mysql不会考虑重音来验证索引键的唯一性

时间:2010-01-06 04:27:11

标签: mysql character-encoding collation unique-key

我有一个只有一个名为“tag”的字段的表,它是一个varchar(250)

该字段定义为排序规则'latin1_spanish_ci',因为我打算用西班牙语保存单词......

问题是以下查询

select * from test where tag = 'unó'

给出了与

完全相同的结果
select * from test where tag = 'uno'

也就是说,对于mysql,'uno'='unó'......和'unò','unö'......等......

这个字段有一个独特的密钥......

我尝试了其他排序规则,所有“bin”排序似乎都有效,而且latin1_general_ci也是如此......

我想知道这是否适合为数据库中的每个字段选择合适的排序规则,或者如果我在选择它时可能遇到任何问题...考虑到我计划存储西班牙语数据在那个数据库...

saludos

SAS

ps:无论如何,在西班牙语的整理口音中,口音似乎很奇怪......

-

编辑:我做了几个测试,我用áÁéÉñÑ等输入数据,似乎mysql可以真正处理它们......

4 个答案:

答案 0 :(得分:2)

您可以使用latin1_general_ci作为默认数据库/表/列排序规则,并在需要时根据每个选项指定latin1_spanish_ci

select * from test order by tag collate latin1_spanish_ci;
select * from test where tag = 'uno' collate latin1_spanish_ci;

因为latin1_spanish_ci中的'o','ó'等被认为是相等的,所以如果表中包含例如'{1}},则后一语句会返回多个结果。 'uno','unó'和'unò'。

答案 1 :(得分:1)

排序规则不用于定义列中数据的语言。它用于定义不同字母或多个字母/代码点必须如何定义为相同(排序和相等)。

ci后缀latin1_spanish_ci表示不区分大小写

如果您希望能够区分任何突出显示的字母和任何案例,则以语言名称命名的排序规则不合适。请使用带有_bin后缀的排序规则。

您还可以attach a specific collation一个值来强制使用特定排序规则对列进行整理:

SELECT * FROM test WHERE tag = ('uno' COLLATE latin1_bin);

答案 2 :(得分:0)

您可以使用UTF-8排序规则来区分值。

答案 3 :(得分:0)

这是解决此问题的快速方法。

'unó'应该在数据库中另存为'un ó'。

然后您的搜索应类似于

从数据库其中字段='un ó'的* *

使用UNICODE HTML ENTITY是关键https://www.compart.com/en/unicode/U+00F3 ...干杯!