每个字符串字面值都有一个字符集和一个排序规则。
对于简单语句选择“
方法定义的连接默认字符集和排序规则字符串
'character_set_connection
而且collation_connection
系统变量。
字符串字面值可以有一个可选的字符集引入器和核对
子句,将其指定为使用特定字符集和排序规则的字符串:
(_charset_name]'字符串(核对collation_name]
的_
表达式的正式名称是an介绍人.它告诉解析器,”后面的字符串使用字符集charset_name
charset_name
.”引入器不会像这样将字符串更改为引入器字符集将()
要做的事情。它不会改变字符串值,尽管可能会出现填充。引入器只是一个信号。看到第10.3.8节“字符集介绍器”.
例子:
选择“abc”;选择_latin1'abc ';选择_binary 'abc ';SELECT _utf8'abc' COLLATE utf8_danish_ci;
字符集介绍器和核对
子句是根据标准SQL规范实现的。
MySQL以以下方式确定字符串文字的字符集和排序:
如果两个
_charset_name
而且核对
是否指定,字符集collation_name
charset_name
和排序collation_name
使用。collation_name
必须是允许的整理charset_name
.如果
_charset_name
但指定核对
没有指定,字符集charset_name
和它的默认排序规则。要查看每个字符集的默认排序规则,请使用显示字符集
语句或查询INFORMATION_SCHEMA
CHARACTER_SETS
表格如果
_charset_name
没有指定,但是核对
时,连接的默认字符集由collation_name
character_set_connection
系统变量和整理collation_name
使用。collation_name
必须是连接默认字符集允许的排序规则。否则(既不
_charset_name
也不核对
时,连接的默认字符集和collation_name
character_set_connection
而且collation_connection
使用系统变量。
例子:
一个非二进制字符串
latin1
字符集和latin1_german1_ci
排序:SELECT _latin1'Müller' COLLATE latin1_german1_ci;
一个非二进制字符串
use utf8
字符集及其默认排序规则(即,utf8_general_ci
):选择_utf8'Muller ';
具有的二进制字符串
二进制
字符集及其默认排序规则(即,二进制
):选择_binary 'Muller ';
具有连接默认字符集和的非二进制字符串
utf8_general_ci
如果连接字符集不是,则排序失败use utf8
):SELECT 'Müller' COLLATE utf8_general_ci;
具有连接默认字符集和排序规则的字符串:
选择“穆勒”;
引入器指示以下字符串的字符集,但不改变解析器在字符串内执行转义处理的方式。的字符集始终由解析器解释转义character_set_connection
.
下面的示例显示使用发生转义处理character_set_connection
即使有介绍人在场。使用的例子组名称
(更改character_set_connection
,详见第10.4节“连接字符集和排序规则”方法显示结果字符串十六进制()
函数,以便能够看到确切的字符串内容。
示例1:
SET NAMES latin1;mysql> SELECT HEX('à\n'), HEX(_sjis'à\n');+------------+-----------------+ | 十六进制(“\ n”)|十六进制(_sjis \ n ') | +------------+-----------------+ | E00A | E00A | +------------+-----------------+
在这里,一个
(十六进制值E0
),其后是\ n
,换行符的转义序列。方法解释转义序列character_set_connection
的价值latin1
生成文本换行符(十六进制值)0一个
).这甚至发生在第二弦上。也就是说,_sjis
引入器不影响解析器的转义处理。
示例2:
SET NAMES sjis;mysql> SELECT HEX('à\n'), HEX(_latin1'à\n');+------------+-------------------+ | 十六进制(“\ n”)|十六进制(_latin1'a \ n ') | +------------+-------------------+ | E05C6E | E05C6E | +------------+-------------------+
在这里,character_set_connection
是sjis
的序列的字符集一个
紧随其后的是\
(十六进制值05
而且5度
)是有效的多字节字符。因此,字符串的前两个字节被解释为单个字节sjis
字符,\
不解释为转义字符。以下n
(十六进制值6 e
)不被解释为转义序列的一部分。即使是第二根弦也是如此;的_latin1
引入器不影响转义处理。