字面值
本节描述如何在MySQL中编写字面值,这些参数包括字符串、数字、十六进制和位值、布尔值和NULL
,本节还将介绍在MySQL中处理这些基本类型时可能遇到的各种细微差别。
字符串字面值
字符串是一个字节或字符序列,包含在单引号('
)或双引号("
)字符中,例如:
'a string'
"another string"
相互相邻的引用字符串连接为单个字符串,下列行是等价的:
'a string'
'a' ' ' 'string'
如果启用了ANSI_QUOTES
SQL模式,字符串字面值只能用单引号括起来,因为双引号括起来的字符串被解释为标识符。
二进制字符串是由字节组成的字符串,每个二进制字符串都有一个名为binary
的字符集和排序规则。非二进制字符串是一串字符,它有一个非二进制的字符集和一个与字符集兼容的排序规则。
对于这两种类型的字符串,都基于字符串单元的数值比较,对于二进制字符串,单位是字节,使用数值字节值比较。对于非二进制字符串,单位是字符,有些字符集支持多字节字符,使用数字字符码值比较,字符码排序是字符串排序的函数。
字符串字面值可以有一个可选的字符集导入器和COLLATE
子句,将其指定为使用特定字符集和排序规则的字符串:
[_charset_name]'string' [COLLATE collation_name]
例如:
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';
在字符串中,除非启用NO_BACKSLASH_ESCAPES
SQL模式,否则某些序列具有特殊的含义,每个序列都以反斜杠(\
)开头,称为转义字符。MySQL识别下表中所示的转义序列,对于所有其他转义序列,将忽略反斜杠,也就是说,转义字符被解释为没有转义,例如,\x
就是x
。这些序列是区分大小写的,例如,\b
被解释为退格,但是\B
被解释为B
,转义处理是根据character_set_connection
系统变量所表示的字符集来完成的,即使对于前面有一个表示不同字符集的导入器的字符串也是如此。
转义序列 | 序列表示字符 |
---|---|
\0 | ASCII NUL(X'00' )字符 |
\' | 单引号(' )字符 |
\" | 双引号(" )字符 |
\b | 退格字符 |
\n | 换行字符 |
\r | 回车字符 |
\t | 制表符 |
\Z | ASCII 26(Control+Z) |
\\ | 反斜杠(\ )字符 |
\% | %字符 |
\_ | _ 字符 |
ASCII 26字符可以编码为\Z
,以使你能够解决ASCII 26在Windows上代表文件结束的问题,如果试图使用mysql db_name < file_name
,文件中的ASCII 26会导致问题。
\%
和\_
序列用于在模式匹配上下文中搜索%
和_
的文本实例,否则它们将被解释为通配符,如果在模式匹配上下文之外使用\%
或\_
,它们的值是字符串\%
和\_
,而不是%
和_
。
有几种方法可以在字符串中包含引用字符:
- 在字符串内加上引号
'
可以写成''
。 - 在字符串内加上双引号
"
可以写成""
。 - 在引用字符之前加上转义字符(
\
)。 - 在
"
字符串内部加上'
不需要特殊处理’,也不需要重复或转义,同样的道理,在'
字符串内部加上"
不需要特殊处理’。
下面的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
字符的引用字符串,如果没有转义,Windows上的文件末尾可以使用Control+Z
。
在编写应用程序时,在将字符串用作发送到MySQL服务器的SQL语句中的数据值之前,必须正确转义任何可能包含这些特殊字符的字符串,你可以通过两种方式做到这一点:
- 使用转义特殊字符的函数处理字符串,在C程序中,可以使用
mysql_real_escape_string_quote()
C API函数转义字符,在构造其他SQL语句的SQL语句中,可以使用QUOTE()
函数,Perl DBI接口提供了一个quote
方法,用于将特殊字符转换为正确的转义序列,其他语言接口可能提供类似的功能。 - 作为显式转义特殊字符的替代方法,许多MySQL API提供了占位符功能,使你能够将特殊标记插入到语句字符串中,然后在发出语句时将数据值绑定到它们,在本例中,API负责为你转义值中的特殊字符。
Boolean字面值
常量TRUE
和FALSE
的值分别为1
和0
,常量名可以用任何字母大小写书写。
mysql> SELECT TRUE, true, FALSE, false;
-> 1, 1, 0, 0
NULL值
NULL
值表示“没有数据”,NULL可以用任何大小写。
注意,NULL
值与数值类型的0
或字符串类型的空字符串不同。
使用LOAD DATA
或SELECT ... INTO OUTFILE
执行为文本文件导入或导出操作中,NULL
由\N
序列表示。
对于使用ORDER BY
排序,NULL
值在升序排序的其他值之前排序,在降序排序的其他值之后排序。