1

字面值

本节描述如何在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列),应该使用转义序列表示某些字符,必须转义反斜杠(\)和用于引用字符串的引号字符,在某些客户端环境中,可能还需要转义NULControl+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字面值

常量TRUEFALSE的值分别为10,常量名可以用任何字母大小写书写。

mysql> SELECT TRUE, true, FALSE, false;
        -> 1, 1, 0, 0

NULL值

NULL值表示“没有数据”,NULL可以用任何大小写。

注意,NULL值与数值类型的0或字符串类型的空字符串不同。

使用LOAD DATASELECT ... INTO OUTFILE执行为文本文件导入或导出操作中,NULL\N序列表示。

对于使用ORDER BY排序,NULL值在升序排序的其他值之前排序,在降序排序的其他值之后排序。



博弈
2.5k 声望1.5k 粉丝

态度决定一切