MySQL 8.4 参考手册  /  ...  /  字符串字面量

11.1.1 字符串字面量

字符串是由单引号 (') 或双引号 (") 字符包围的一系列字节或字符。例如:

'a string'
"another string"

并排放置的带引号字符串将连接成单个字符串。以下几行是等效的:

'a string'
'a' ' ' 'string'

如果启用了 ANSI_QUOTES SQL 模式,则字符串字面量只能在单引号内引用,因为在双引号内引用的字符串将被解释为标识符。

二进制字符串 是一个字节字符串。每个二进制字符串都有一个名为 binary 的字符集和排序规则。非二进制字符串 是一个字符字符串。它有一个不同于 binary 的字符集和一个与该字符集兼容的排序规则。

对于这两种类型的字符串,比较都是基于字符串单元的数值。对于二进制字符串,单元是字节;比较使用数值字节值。对于非二进制字符串,单元是字符,并且某些字符集支持多字节字符;比较使用数值字符代码值。字符代码排序是字符串排序规则的一个函数。(有关更多信息,请参阅 第 12.8.5 节“二进制排序规则与 _bin 排序规则的比较”。)

注意

mysql 客户端中,二进制字符串使用十六进制表示法显示,具体取决于 --binary-as-hex 的值。有关该选项的更多信息,请参阅 第 6.5.1 节“mysql - MySQL 命令行客户端”

字符字符串字面量可以有一个可选的字符集引导程序和 COLLATE 子句,以将其指定为使用特定字符集和排序规则的字符串:

[_charset_name]'string' [COLLATE collation_name]

例如:

SELECT _latin1'string';
SELECT _binary'string';
SELECT _utf8mb4'string' COLLATE utf8mb4_danish_ci;

您可以使用 N'literal'(或 n'literal')在国家字符集中创建一个字符串。以下语句是等效的:

SELECT N'some text';
SELECT n'some text';
SELECT _utf8'some text';

有关这些形式的字符串语法的更多信息,请参阅 第 12.3.7 节“国家字符集”第 12.3.8 节“字符集引导程序”

在字符串中,除非启用了 NO_BACKSLASH_ESCAPES SQL 模式,否则某些序列具有特殊含义。这些序列中的每一个都以反斜杠 (\) 开头,称为 转义字符。MySQL 识别 表 11.1“特殊字符转义序列” 中显示的转义序列。对于所有其他转义序列,反斜杠将被忽略。也就是说,转义字符将被解释为好像它没有被转义一样。例如,\x 就是 x。这些序列区分大小写。例如,\b 被解释为空格,但 \B 被解释为 B。转义处理是根据 character_set_connection 系统变量指示的字符集完成的。即使对于前面有指示不同字符集的引导程序的字符串也是如此,如 第 12.3.6 节“字符字符串字面量字符集和排序规则” 中所述。

表 11.1 特殊字符转义序列

转义序列 序列表示的字符
\0 ASCII NUL (X'00') 字符
\' 单引号 (') 字符
\" 双引号 (") 字符
\b 退格字符
\n 换行符
\r 回车符
\t 制表符
\Z ASCII 26 (Control+Z);请参阅表后的注释
\\ 反斜杠 (\) 字符
\% % 字符;请参阅表后的注释
\_ _ 字符;请参阅表后的注释

ASCII 26 字符可以编码为 \Z,以便您能够解决 ASCII 26 在 Windows 上代表文件结束符的问题。如果尝试使用 mysql db_name < file_name,则文件中的 ASCII 26 会导致问题。

\%\_ 序列用于在模式匹配上下文中搜索 %_ 的字面实例,否则它们将被解释为通配符。请参阅 第 14.8.1 节“字符串比较函数和运算符” 中对 LIKE 运算符的描述。如果在模式匹配上下文之外使用 \%\_,则它们将分别计算为字符串 \%\_,而不是 %_

有几种方法可以在字符串中包含引号字符:

  • ' 引用的字符串中的 ' 可以写成 ''

  • " 引用的字符串中的 " 可以写成 ""

  • 在引号字符前面加上转义字符 (\)。

  • " 引用的字符串中的 ' 不需要特殊处理,也不需要加倍或转义。同样,用 ' 引用的字符串中的 " 也不需要特殊处理。

以下 SELECT 语句演示了引号和转义的工作原理:

mysql> SELECT 'hello', '"hello"', '""hello""', 'hel''lo', '\'hello';
+-------+---------+-----------+--------+--------+
| hello | "hello" | ""hello"" | hel'lo | 'hello |
+-------+---------+-----------+--------+--------+

mysql> SELECT "hello", "'hello'", "''hello''", "hel""lo", "\"hello";
+-------+---------+-----------+--------+--------+
| hello | 'hello' | ''hello'' | hel"lo | "hello |
+-------+---------+-----------+--------+--------+

mysql> SELECT 'This\nIs\nFour\nLines';
+--------------------+
| This
Is
Four
Lines |
+--------------------+

mysql> SELECT 'disappearing\ backslash';
+------------------------+
| disappearing backslash |
+------------------------+

要将二进制数据插入字符串列(例如 BLOB 列),您应该使用转义序列来表示某些字符。反斜杠 (\) 和用于引用字符串的引号字符必须进行转义。在某些客户端环境中,可能还需要转义 NUL 或 Control+Z。mysql 客户端会截断包含未转义的 NUL 字符的带引号字符串,如果未转义,Control+Z 在 Windows 上可能会被视为文件结束符。有关表示每个字符的转义序列,请参阅 表 11.1“特殊字符转义序列”

在编写应用程序时,任何可能包含这些特殊字符的字符串都必须在作为数据值用于发送到 MySQL 服务器的 SQL 语句之前进行正确转义。您可以通过两种方式做到这一点:

  • 使用转义特殊字符的函数处理字符串。在 C 程序中,您可以使用 mysql_real_escape_string_quote() C API 函数来转义字符。请参阅 mysql_real_escape_string_quote()。在构造其他 SQL 语句的 SQL 语句中,您可以使用 QUOTE() 函数。Perl DBI 接口提供了一个 quote 方法,用于将特殊字符转换为正确的转义序列。请参阅 第 31.9 节“MySQL Perl API”。其他语言接口可能提供类似的功能。

  • 作为显式转义特殊字符的替代方法,许多 MySQL API 都提供了占位符功能,使您能够在语句字符串中插入特殊标记,然后在发出语句时将数据值绑定到它们。在这种情况下,API 会为您处理值中的特殊字符转义。