MySQL 8.0 参考手册  / 第9章语言结构  / 9.1 文字值  /  9.1.1 字符串文字

9.1.1 字符串文字

字符串是字节或字符的序列,用单引号 ( ') 或双引号 ( ") 字符括起来。例子:

'a string'
"another string"

彼此相邻放置的带引号的字符串连接成一个字符串。以下几行是等效的:

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

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

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

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

笔记

mysql客户端中,二进制字符串使用十六进制表示法显示,具体取决于--binary-as-hex. 有关该选项的更多信息,请参阅第 4.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';

有关这些形式的字符串语法的信息,请参阅 第 10.3.7 节,“国家字符集”第 10.3.8 节,“字符集介绍者”

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

表 9.1 特殊字符转义序列

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

可以对 ASCII 26 字符进行编码\Z ,使您能够解决 ASCII 26 在 Windows 上代表 END-OF-FILE 的问题。如果您尝试在文件中使用 ASCII 26 会导致问题。 mysql db_name < file_name

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

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

  • '用 引用的字符串中 的 A'可以写为 ''.

  • "用 引用的字符串中 的 A"可以写为 "".

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

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

以下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。对于代表这些字符中的每一个的转义序列,请 参见表 9.1,“特殊字符转义序列”

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

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

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