19

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

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

错误 1253 (42000): COLLATION 'utf8_general_ci' 对 CHARACTER SET 'latin1' 无效

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

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

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

4

4 回答 4

41

MySQL 中的字符串有一个字符集和一个排序规则。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'
于 2009-05-23T07:55:57.827 回答
2

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

于 2013-05-18T15:38:08.457 回答
2

试试这个,它对我有用

SELECT * FROM usersWHERE UPPER( name) = UPPER('josé') 整理 utf8_bin;

于 2015-12-23T11:22:39.050 回答
1

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

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

于 2009-05-23T07:52:42.980 回答