Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  String Literals

11.1.1 字符串字面量

字符串是一系列字节或字符,括在单引号 (') 或双引号 (") 字符中。示例:

'a string'
"another string"

相邻的引号字符串将被连接成一个字符串。以下行是等效的:

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

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

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

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

Note

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 特殊字符转义序列

Escape Sequence Character Represented by Sequence
\0 一个 ASCII NUL (X'00') 字符
\' 一个单引号 (') 字符
\" 一个双引号 (") 字符
\b 一个退格符
\n 一个换行(换行)字符
\r 一个回车字符
\t 一个制表符
\Z ASCII 26(控制+Z); 见表格后面的注释
\\ 一个反斜杠(\)字符
\% 一个 % 字符; 见表格后面的注释
\_ 一个 _ 字符; 见表格后面的注释

ASCII 26 字符可以编码为 \Z,以便您可以绕过 Windows 上的 END-OF-FILE 问题。ASCII 26 在文件中会引起问题,如果您尝试使用 mysql db_name < file_name

\%\_ 序列用于在模式匹配上下文中搜索文字实例 %_。见 LIKE 运算符的描述在 第 14.8.1 节,“字符串比较函数和运算符”。如果您在模式匹配上下文外使用 \%\_,它们将评估为字符串 \%\_,而不是 %_

有多种方式可以在字符串中包含引号字符:

  • 一个 ' 在用 ' 引用的字符串中可以写作 ''

  • 一个 " 在用 " 引用的字符串中可以写作 ""

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

  • 一个 ' 在用 " 引用的字符串中不需要特殊处理,不需要双引号或转义。同样," 在用 ' 引用的字符串中不需要特殊处理。

以下 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 或控制+Z。 mysql 客户端将截断包含 NUL 字符的引号字符串,如果它们没有被转义,而控制+Z 可能在 Windows 上被视为 END-OF-FILE,如果没有被转义。有关这些字符的转义序列,请参见 表 11.1,“特殊字符转义序列”

在编写应用程序时,任何可能包含这些特殊字符的字符串都必须在将字符串用作 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 将为您转义值中的特殊字符。