【问题标题】:MYSQL case sensitive search for utf8_bin fieldMYSQL 对 utf8_bin 字段区分大小写搜索
【发布时间】:2010-10-28 09:57:24
【问题描述】:

我创建了一个表并将排序规则设置为 utf8,以便能够向字段添加唯一索引。现在我需要进行不区分大小写的搜索,但是当我使用 collat​​e 关键字执行一些查询时,我得到了:

mysql> select * from page where pageTitle="Something" Collate utf8_general_ci;

ERROR 1253 (42000): COLLATION 'utf8_general_ci' 对 字符集'latin1'

mysql> select * from page where pageTitle="Something" Collate latin1_general_ci;

ERROR 1267 (HY000): 非法混合排序规则 (utf8_bin,IMPLICIT) 和 (latin1_general_ci,EXPLICIT) 用于操作“=”

我对 SQL 很陌生,所以我想知道是否有人可以提供帮助。

【问题讨论】:

    标签: mysql sql character-encoding case-sensitive mysql-error-1267


    【解决方案1】:

    试试这个,它对我有用

    SELECT * FROM users WHERE UPPER(name) = UPPER('josé') COLLATE utf8_bin;

    【讨论】:

      【解决方案2】:

      另外请注意,在使用“Collat​​e utf8_general_ci”或“Collat​​e latin1_general_ci”的情况下,即“强制”整理 - 这样的转换将阻止使用现有索引!这可能会成为未来性能的瓶颈。

      【讨论】:

        【解决方案3】:

        MySQL 中的字符串有一个character set and a collation。 utf8 是字符集,utf8_bin 是它的排序规则之一。要将您的字符串文字与 utf8 列进行比较,请将其转换为 utf8,方法是在其前面加上 _charset 符号:

        _utf8 'Something'
        

        现在排序规则仅对某些字符集有效。 utf8 的区分大小写 排序规则似乎是 utf8_bin,您可以指定如下:

        _utf8 'Something' collate utf8_bin
        

        通过这些转换,查询应该可以工作:

        select * from page where pageTitle = _utf8 'Something' collate utf8_bin
        

        _charset 前缀适用于字符串文字。要更改字段的字符集,有 CONVERT ... USING。当您想将 pageTitle 字段转换为另一个字符集时,这很有用,如下所示:

        select * from page 
        where convert(pageTitle using latin1) collate latin1_general_cs = 'Something'
        

        要查看名为“TAB”的表中名为“col”的列的字符和排序规则,请尝试:

        select distinct collation(col), charset(col) from TAB
        

        所有字符集和排序规则的列表可以通过以下方式找到:

        show character set
        show collation
        

        所有 utf8 的有效排序规则都可以通过以下方式找到:

        show collation where charset = 'utf8'
        

        【讨论】:

        • 太棒了 - 我遇到了类似的问题,但我需要 latin1 而不是 utf8,_latin1 为我完成了这项工作。
        【解决方案4】:

        请问为什么在执行 SELECT 时需要显式更改排序规则?为什么不按您想要在排序时检索记录的方式进行整理?

        您的搜索区分大小写时遇到的问题是您有一个二进制排序规则。尝试改用通用排序规则。有关区分大小写和排序规则的更多信息,请查看此处: Case Sensitivity in String Searches

        【讨论】:

        • 但是如果我需要一个二进制排序规则,并且我想要不区分大小写的搜索怎么办。使用一般排序规则,如果您有唯一字段,如果 'Cacak' 已经存在,则在尝试插入 'Čačak' 时会出错。
        猜你喜欢
        • 1970-01-01
        • 2011-04-13
        • 2013-09-26
        • 2013-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-09
        • 1970-01-01
        相关资源
        最近更新 更多