为什么我不能在MySQL中使用特定的排序规则?

3

我有一个使用字符集latin1的表(通过show variables like "character_set_database";检查),默认排序规则为latin1_swedish_ci(通过SHOW TABLE STATUS;检查)。

我想要使用编译在我的系统上的排序规则latin1_general_cs运行查询(通过Show collation LIKE "%_cs";检查):

select * from myTab WHERE col RLIKE '[[:upper:]]' COLLATE 'latin1_general_cs' LIMIT 10;

这会产生一个错误:

ERROR 1253 (42000): COLLATION 'latin1_general_cs' is not valid for CHARACTER SET 'utf8'

即使使用默认排序规则也无法工作:

select * from myTab WHERE col RLIKE '[[:upper:]]' COLLATE 'latin1_swedish_ci' LIMIT 10;

错误:

ERROR 1253 (42000): COLLATION 'latin1_swedish_ci' is not valid for CHARACTER SET 'utf8'

出了什么问题?是因为我的终端发送的数据是UTF-8编码吗?(连接使用的是“UTF-8”吗?)我怎样才能使用大小写敏感排序呢?我需要它,否则似乎无法检查大写字母。

2个回答

3

你可能会觉得这很有趣。

UTF8和Latin1之间的区别

我不能说我在这个领域是专家,但据我观察,UTF8和Latin1以不同的方式编码字符。因此,尝试使用Latin1对UTF8进行排序是没有意义的。

http://dev.mysql.com/doc/refman/5.0/en/charset-applications.html

相比之下:

CREATE DATABASE mydb
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE utf8_general_ci;

保持一致。

更新

抱歉,我刚刚重新阅读了你的问题,你说表格使用的是latin1。很奇怪。你尝试使用utf8排序规则了吗?


1
utf8_general_cs 没有被安装或编译。我不知道如何安装它。但在安装之前,最好先了解为什么它不能工作。也许有一种方法可以转换我的数据,或者在启动mySQL时使用另一种字符集。现在我正在尝试将表本身转换为 latin1_general_cs 排序规则,使用 alter table myTab convert to character set latin1 collate latin1_general_cs;。这可能需要一些时间,因为所有索引都必须被重写。 - R_User
1
似乎 SELECT * FROM myTab WHERE col RLIKE CONVERT(_utf8'[[:upper:]]' USING 'latin1') COLLATE 'latin1_general_cs' LIMIT 10; 是有效的。可能是因为与MySQL的连接是UTF8。但似乎没有人知道...我也使用R连接到MySQL - 我不知道连接使用哪种字符集。我一直以为MySQL会自动处理并转换。 - R_User

0

我认为问题出在其他地方。RLIKE是正则表达式函数,COLLATE...在这里没有影响。看一下 ->

#1 - false
SELECT 'koníček' = 'konicek' COLLATE utf8_czech_ci;

#2 - false
SELECT 'koníček' LIKE 'konicek' COLLATE utf8_czech_ci;

#3 - false
SELECT 'koníček' RLIKE 'konicek' COLLATE utf8_czech_ci;

#4 - true
SELECT 'koníček' = 'konicek' COLLATE utf8_general_ci;

#5 - true
SELECT 'koníček' LIKE 'konicek' COLLATE utf8_general_ci;

#6 - false
SELECT 'koníček' RLIKE 'konicek' COLLATE utf8_general_ci;

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