MYSQL区分大小写搜索utf8_bin字段

18 mysql sql case-sensitive character-encoding mysql-error-1267

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

mysql> select * from page where pageTitle="Something" Collate utf8_general_ci;
Run Code Online (Sandbox Code Playgroud)

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

mysql> select * from page where pageTitle="Something" Collate latin1_general_ci;
Run Code Online (Sandbox Code Playgroud)

ERROR 1267(HY000):操作'='的非法混合排序(utf8_bin,IMPLICIT)和(latin1_general_ci,EXPLICIT)

我对SQL很新,所以我想知道是否有人可以提供帮助.

And*_*mar 40

MySQL中的字符串具有字符集和排序规则.Utf8是字符集,utf8_bin是其排序规则之一.要将字符串文字与utf8列进行比较,请将其转换为utf8,方法是在其前面添加_charset表示法:

_utf8 'Something'
Run Code Online (Sandbox Code Playgroud)

现在,排序规则仅对某些字符集有效.该区分大小写的UTF8归类似乎utf8_bin,您可以指定,如:

_utf8 'Something' collate utf8_bin
Run Code Online (Sandbox Code Playgroud)

通过这些转换,查询应该有效:

select * from page where pageTitle = _utf8 'Something' collate utf8_bin
Run Code Online (Sandbox Code Playgroud)

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

select * from page 
where convert(pageTitle using latin1) collate latin1_general_cs = 'Something'
Run Code Online (Sandbox Code Playgroud)

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

select distinct collation(col), charset(col) from TAB
Run Code Online (Sandbox Code Playgroud)

可以在以下位置找到所有字符集和排序规则的列表:

show character set
show collation
Run Code Online (Sandbox Code Playgroud)

并且可以找到utf8的所有有效排序规则:

show collation where charset = 'utf8'
Run Code Online (Sandbox Code Playgroud)