:
select ' string ';
select _latin1 ' string ';
select _latin1' string ' COLLATE latin1_danish_ci;
对于简单的语句select ' string ',字符串使用由character_set_connection和collation_connection系统变量定义的字符集和校对规则。
_ charset_name表达式正式称做一个引介词。它告诉解析程序,“后面将要出现的字符串使用字符集X。”引介词在标准十六进制字母和数字十六进制符号(x ' literal '和 0x nnnn )中是合法的。
例如:
select _latin1 x'AABBCC';
select _latin1 0xAABBCC;
MySQL这样确定一个文字字符集和校对规则:
如果指定了CHARACTER SET X和COLLATE Y,那么使用CHARACTER SET X和COLLATE Y。如果指定了CHARACTER SET X而没有指定COLLATE Y,那么使用CHARACTER SET X的默认校对规则。否则,使用通过character_set_connection和collation_connection系统变量给出的字符集和校对规则。
例如:
使用latin1字符集和latin1_german1_ci校对规则的字符串:
select_latin1'Müller' COLLATE latin1_german1_ci;
使用latin1字符集和其默认校对规则的字符串(即,latin1_swedish_ci):
select_latin1'Müller';
使用连接默认字符集和校对规则的字符串:
select 'Müller';
字符集引介词和COLLATE子句是根据标准SQL规范实现的。
COLLATE可以用于多种SQL语 句中:order by、as、group by、聚合函数、distinct、where、having等。COLLATE子句有较高的优先级(高于||)。
BINARY操作符是COLLATE子句的一个速记符。BINARY ' x '等价与' x ' COLLATE y ,这里y是字符 集' x '二元校对规则的名字。每一个字符集有一个二元校对规则。例如,latin1字符集的二元校对规则是latin1_bin,因此,如果列a是字符集latin1,以下两个语句有相同效果:
select * from t1 order by BINARY a;
select * from t1 order by a COLLATE latin1_bin;
7、校对规则的“可压缩性”
在绝大多数查询中,mysql使用哪种校对规则进行比较是很显然的。例如,在下列情况中,校对规则明显的是“列x的列校对规则”:
select x from T order by x;
select x from T where x = x;
select distinct x from T;
但是,当涉及多个操作数时,可能不明确。例如:
select x from T where x = 'Y';
这个查询应该使用列x的校对规则,还是字符串文字'Y'的校对规则?
标准化SQL使用“可压缩性”规则解决这种问题。基本上,这个意思是:既然x和'Y'都有 校对规 则,哪个校对规则优先?这可能比较难解决,但是以下规则适合大多数情况:
一个外在的COLLATE子句可压缩性是0(根本不能压缩。)使用不同校对规则的两个字符串连接的可压缩性是1。列校对规则的可压缩性是2。“系统常数”(如USER()或VERSION()函数返回的字符串)可压缩性是3。文字规则的可压缩性是4。NULL或从NULL派生的表达式的可压缩性是 5。
上述可压缩性值是mysql当前所用的。
这样上述规则可以模糊解决:
使用最低的可压缩性值的校对规则。如果两侧有相同的可压缩性,那么如果校对规则不同则发生错误。
使用COERCIBILITY()函数确定一个字符串表达式的可压缩性:
mysql> SELECT COERCIBILITY('A' COLLATE latin1_swedish_ci);
-> 0
mysql> SELECT COERCIBILITY(VERSION());
-> 3
mysql> SELECT COERCIBILITY('A');
-> 4