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

时间:2013-05-15 09:30:26

标签: mysql character-encoding collation uppercase

我的表格包含字符集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 个答案:

答案 0 :(得分:3)

你可能会发现这很有趣。

Differences between utf8 and 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 :(得分:0)

我认为问题出在其他地方。 RLIKE是regexp函数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;