我创建了一个表并将排序规则设置为 utf8 ,以便能够为字段添加唯一索引。现在我需要进行不区分大小写的搜索,但是当我使用collate关键字执行一些查询时,我得到了:
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很陌生,所以我想知道是否有人可以提供帮助。
答案 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)
另请注意,如果使用“Collate utf8_general_ci”或“Collate latin1_general_ci”,即“强制”整理 - 这样的转换将阻止使用现有索引!这可能是未来表现的瓶颈。
答案 2 :(得分:2)
试试这个,它为我工作
SELECT * FROM users
WHERE UPPER(name
)= UPPER('josé')COLLATE utf8_bin;
答案 3 :(得分:1)
请问您为什么需要在执行SELECT时明确更改排序规则?为什么不按照排序时检索记录的方式进行整理?
您的搜索区分大小写的问题是您有二进制排序规则。请尝试使用常规排序规则。有关区分大小写和排序规则的更多信息,请在此处查看: Case Sensitivity in String Searches