【问题标题】:mysql doesn't take accents into account validating uniqueness of index keymysql 不考虑重音来验证索引键的唯一性
【发布时间】:2011-01-01 22:17:38
【问题描述】:

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

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

问题在于以下查询

select * from test where tag = 'unó'

给我的结果与

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

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

这个字段应该有一个唯一的键...

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

我只想知道这是否是为数据库中的每个字段选择的适当排序规则,或者我在选择它时是否会遇到任何问题...考虑到我打算存储西班牙数据在那个数据库中...

感谢

sas

ps:无论如何,在西班牙语排序规则中,口音可能被认为是无意义的,这似乎很奇怪......

--

edit:我做了几个测试,我用á Á é É ñ Ñ等输入数据,看起来mysql真的可以处理它们......

【问题讨论】:

    标签: mysql character-encoding collation unique-key


    【解决方案1】:

    您可以使用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;
    

    因为 'o'、'ó' 等在 latin1_spanish_ci 中被认为是相等的,如果表包含例如,后一个语句将返回多个结果。 'uno'、'unó' 和 'unò'。

    【讨论】:

      【解决方案2】:

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

      latin1_spanish_cici 后缀表示不区分大小写

      如果您希望能够区分任何重读字母和任何大小写,则以语言名称命名的排序规则是不合适的。请改用带有_bin 后缀的排序规则。

      您还可以attach a specific collation 对某个值强制使用特定的排序规则而不是列的排序规则:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          这是对这个问题的快速修复。

          'unó' 应在您的数据库中保存为 'unó'。

          那么你的搜索应该是这样的

          SELECT * from database where field = 'unó'

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

          【讨论】:

            猜你喜欢
            • 2013-05-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-01-01
            • 2022-10-01
            • 1970-01-01
            • 2011-05-05
            相关资源
            最近更新 更多