字符串是一系列字节或字符,括在单引号 ('
) 或双引号 ("
) 字符中。示例:
'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 节,“字符字符串字面量字符集和排序规则” 中所讨论的那样。
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 将为您转义值中的特殊字符。