MYSQL区分大小写搜索utf8_bin字段

时间:2009-05-23 07:23:05

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

我创建了一个表并将排序规则设置为 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很陌生,所以我想知道是否有人可以提供帮助。

4 个答案:

答案 0 :(得分:40)

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

_utf8 'Something'

现在,排序规则仅对某些字符集有效。 utf8的case- 敏感排序规则似乎是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'

答案 1 :(得分:2)

另请注意,如果使用“Collat​​e utf8_general_ci”或“Collat​​e latin1_general_ci”,即“强制”整理 - 这样的转换将阻止使用现有索引!这可能是未来表现的瓶颈。

答案 2 :(得分:2)

试试这个,它为我工作

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

答案 3 :(得分:1)

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

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

相关问题