9.1.1 字符串 Literals

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

'a string'
"another string"

彼此相邻的带引号的字符串被串联为单个字符串。以下几行是等效的:

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

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

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

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

字符串 Literals 可能具有可选的字符集介绍人和COLLATE子句,以将其指定为使用特定字符集和排序规则的字符串:

[_charset_name]'string' [COLLATE collation_name]

Examples:

SELECT _latin1'string';
SELECT _binary'string';
SELECT _utf8'string' COLLATE utf8_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 识别table9.1,“特殊字符转义序列”中显示的转义序列。对于所有其他转义序列,将忽略反斜杠。即,将转义字符解释为好像没有转义。例如,\x只是x。这些序列区分大小写。例如,\b被解释为退格,而\B被解释为B。根据character_set_connection系统变量指示的字符集进行转义处理。即使对于在第 10.3.6 节“字符字符串 Literals 字符集和排序规则”中讨论过的指示了不同字符集的引导程序之后的字符串也是如此。

table9.1 特殊字符转义序列

Escape Sequence序列 table 示的字符
\0 ASCII NUL(X'00')字符
\' 单引号(')字符
\" 双引号(")字符
\b 退格字符
\n 换行符(换行符)
\r 回车符
\t 制 table 符
\Z ASCII 26(控制 Z);请参阅 table 格后面的 Comments
\\ 反斜杠(\)字符
\% %个字符;请参阅 table 格后面的 Comments
\_ _个字符;请参阅 table 格后面的 Comments

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

\%\_序列用于在模式匹配上下文中搜索%_的 Literals 实例,否则它们将被解释为通配符。请参阅第 12.7.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列),应使用转义序列 table 示某些字符。反斜杠(\)和用于引用字符串的引用字符必须转义。在某些 Client 端环境中,可能还需要转义NUL或 ControlZ。如果不转义,则mysqlClient 端会截断包含NUL字符的引号字符串,如果未转义,则 Windows 上的 END-OF-FILE 可能会采用 ControlZ。有关代 table 这些字符中每个字符的转义序列,请参见table9.1,“特殊字符转义序列”

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

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

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