每个字符串文字都有一个字符集和一个排序规则。
对于简单语句,字符串具有由
和系统变量
定义的连接默认字符集和排序规则。SELECT
'
string
'character_set_connection
collation_connection
字符串文字可能有一个可选的字符集介绍符和COLLATE
子句,以将其指定为使用特定字符集和排序规则的字符串:
[_charset_name]'string' [COLLATE collation_name]
该
表达式的正式名称为
介绍人。它告诉解析器,“后面的字符串使用了字符集
。”介绍人不会像往常那样
将字符串更改为介绍人字符集。它不会更改字符串值,但可能会出现填充。介绍人只是一个信号。请参阅
第 10.3.8 节,“字符集介绍人”。
_
charset_name
charset_name
CONVERT()
例子:
SELECT 'abc';
SELECT _latin1'abc';
SELECT _binary'abc';
SELECT _utf8mb4'abc' COLLATE utf8mb4_danish_ci;
字符集引入器和COLLATE
子句根据标准 SQL 规范实现。
MySQL通过以下方式确定字符串文字的字符集和排序规则:
如果同时指定了
_charset_name
和 ,则使用字符集 和排序规则 。 必须是 的允许排序规则 。COLLATE
collation_name
charset_name
collation_name
collation_name
charset_name
如果
_charset_name
指定但未COLLATE
指定,则使用字符集charset_name
及其默认排序规则。要查看每个字符集的默认排序规则,请使用SHOW CHARACTER SET
语句或查询INFORMATION_SCHEMA
CHARACTER_SETS
表。如果
_charset_name
未指定但指定,则使用 系统变量和排序规则 给定的连接默认字符集 。 必须是连接默认字符集允许的排序规则。COLLATE
collation_name
character_set_connection
collation_name
collation_name
否则(既未指定
_charset_name
也未指定),使用 和 系统变量 给出的连接默认字符集和排序规则 。COLLATE
collation_name
character_set_connection
collation_connection
例子:
具有
latin1
字符集和latin1_german1_ci
排序规则的非二进制字符串:SELECT _latin1'Müller' COLLATE latin1_german1_ci;
具有
utf8mb4
字符集及其默认排序规则(即utf8mb4_0900_ai_ci
)的非二进制字符串:SELECT _utf8mb4'Müller';
具有
binary
字符集及其默认排序规则(即binary
)的二进制字符串:SELECT _binary'Müller';
具有连接默认字符集和
utf8mb4_0900_ai_ci
排序规则的非二进制字符串(如果连接字符集不是 ,则失败utf8mb4
):SELECT 'Müller' COLLATE utf8mb4_0900_ai_ci;
具有连接默认字符集和排序规则的字符串:
SELECT 'Müller';
Introducer 指示后续字符串的字符集,但不会更改解析器在字符串中执行转义处理的方式。转义总是由解析器根据
character_set_connection
.
以下示例显示
character_set_connection
即使在介绍人在场的情况下也会发生转义处理。这些示例使用
SET NAMES
(它更改
character_set_connection
了,如第 10.4 节“连接字符集和排序规则”中所述),并使用该
HEX()
函数显示结果字符串,以便可以看到确切的字符串内容。
示例 1:
mysql> SET NAMES latin1;
mysql> SELECT HEX('à\n'), HEX(_sjis'à\n');
+------------+-----------------+
| HEX('à\n') | HEX(_sjis'à\n') |
+------------+-----------------+
| E00A | E00A |
+------------+-----------------+
这里,à
(十六进制值
E0
)后跟\n
换行符的转义序列。转义序列使用的
character_set_connection
值进行解释latin1
以生成文字换行符(十六进制值0A
)。即使是第二个字符串也会发生这种情况。即_sjis
引入器不影响解析器的转义处理。
示例 2:
mysql> SET NAMES sjis;
mysql> SELECT HEX('à\n'), HEX(_latin1'à\n');
+------------+-------------------+
| HEX('à\n') | HEX(_latin1'à\n') |
+------------+-------------------+
| E05C6E | E05C6E |
+------------+-------------------+
这里,character_set_connection
是sjis
一个字符集,其中à
后跟
\
(十六进制值05
和5C
)的序列是一个有效的多字节字符。因此,字符串的前两个字节被解释为单个sjis
字符,
\
而不被解释为转义字符。以下n
(十六进制值
6E
)不被解释为转义序列的一部分。即使对于第二个字符串也是如此;介绍人不
_latin1
影响转义处理。