UTF8_BIN字段的MYSQL大小写敏感搜索

19

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

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

错误 1253 (42000): COLLATION 'utf8_general_ci' 不适用于字符集 'latin1'

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

错误 1267 (HY000):编码集不匹配 (utf8_bin, IMPLICIT) 和 (latin1_general_ci, EXPLICIT) 的“=”运算

我对 SQL 还很陌生,所以想请教一下大家能不能帮忙。

4个回答

42

MySQL中的字符串具有字符集和排序规则。 Utf8是字符集,utf8_bin是其中之一的排序规则。 要将您的字符串文字与utf8列进行比较,请通过在其前面加上_charset符号将其转换为utf8:

_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'

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

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

可以通过以下方式获得所有字符集和校对规则的列表:

show character set
show collation

您可以使用以下命令找到 utf8 的所有有效字符集:

show collation where charset = 'utf8'

1
太棒了 - 我遇到了类似的问题,但我需要 latin1 而不是 utf8,_latin1 对我很有帮助。 - Crazy Joe Malloy

2
此外,请注意,如果使用"Collate utf8_general_ci"或"Collate latin1_general_ci",即"force" collate - 这样的转换将防止使用现有索引!这可能会成为未来性能瓶颈。

2

尝试这个,它对我有效

选择 * 从 users Where UPPER(name) = UPPER('josé') COLLATE utf8_bin;


1

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

您遇到的搜索区分大小写的问题是因为您使用了二进制排序规则。尝试改用通用排序规则。有关大小写敏感性和排序规则的更多信息,请参见此处: 字符串搜索中的大小写敏感性


5
如果我需要使用二进制排序,并且想要进行不区分大小写的搜索怎么办?通用排序方式下,如果您有唯一字段,在尝试插入“Čačak”时,如果“Cacak”已经存在,您将会得到错误。 - umpirsky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接