11.1.1 字符串字面量
字符串是一系列的字节或字符,封闭在单引号('
)或双引号("
)字符中。示例:
'a string'
"another string"
相邻的带引号的字符串将被连接到一个字符串。以下几行代码是等效的:
'a string'
'a' ' ' 'string'
如果启用了ANSI_QUOTES SQL模式,字符串字面量只能在单引号中引号,因为在双引号中引号的字符串将被解释为标识符。
一个二进制字符串是一个字节的字符串。每个二进制字符串都有一个名为binary
的字符集和排序。一个非二进制字符串是一个字符的字符串。它有一个除binary
之外的字符集,并且有一个与字符集兼容的排序。
对于这两种字符串,比较都是基于字符串单元的数字值。对于二进制字符串,单元是字节;比较使用数字字节值。对于非二进制字符串,单元是字符;一些字符集支持多字节字符;比较使用数字字符代码值。字符代码顺序是字符串排序的函数。 (更多信息,请见第12.8.5节,“binary 排序与 _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 上 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将为您处理特殊字符的值免除。