MySQL 8.4 Reference Manual  /  ...  /  String Literals

11.1.1 字符串字面量

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

'a string'
"another string"

相邻的带引号的字符串将被连接到一个字符串。以下几行代码是等效的:

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

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

一个二进制字符串是一个字节的字符串。每个二进制字符串都有一个名为binary的字符集和排序。一个非二进制字符串是一个字符的字符串。它有一个除binary之外的字符集,并且有一个与字符集兼容的排序。

对于这两种字符串,比较都是基于字符串单元的数字值。对于二进制字符串,单元是字节;比较使用数字字节值。对于非二进制字符串,单元是字符;一些字符集支持多字节字符;比较使用数字字符代码值。字符代码顺序是字符串排序的函数。 (更多信息,请见第12.8.5节,“binary 排序与 _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 上 ASCII 26 表示 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 或 Control+Z。mysql 客户端将截断包含 NUL 字符的引号字符串,如果不转义,Control+Z 在 Windows 上可能被解释为 END-OF-FILE。如果不转义。见Table 11.1,“特殊字符转义序列”

在编写应用程序时,任何可能包含这些特殊字符的字符串都必须被正确转义,以便将其用作 SQL 语句的一部分在 MySQL 服务器上。您可以使用以下两种方法:

  • 使用函数处理字符串,以免除特殊字符。在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将为您处理特殊字符的值免除。