字面值
TiDB 的字面值包括字符字面值、数值字面值、时间和日期字面值、十六进制、二进制字面值以及 NULL 字面值。本文将介绍这些字面值的用法。
本文描述了字符串字面值、数值字面值、NULL 值、十六进制字面值、日期和时间字面值、布尔字面值以及位值字面值。
字符串字面值
字符串是由字节或字符组成的序列,使用单引号 ' 或双引号 " 包裹。例如:
'example string'
"example string"
相邻的带引号字符串会被拼接为一个字符串。以下几行是等价的:
'a string'
'a' ' ' 'string'
"a" ' ' "string"
如果启用了 ANSI_QUOTES SQL MODE,字符串字面值只能用单引号括起来,因为用双引号括起来的字符串会被解释为标识符。
字符串分为以下两种类型:
- 二进制字符串:由字节序列组成,字符集和排序规则均为
binary,在相互比较时以字节为单位。 - 非二进制字符串:由字符序列组成,字符集和排序规则可以为除
binary以外的多种类型。在相互比较时,非二进制字符串以字符为单位。一个字符可能包含多个字节,具体取决于字符集。
字符串字面值可以带有可选的 字符集引入符 和 COLLATE 子句,用于指定该字符串使用特定的字符集和排序规则。
[_charset_name]'string' [COLLATE collation_name]
例如:
SELECT _latin1'string';
SELECT _binary'string';
SELECT _utf8'string' COLLATE utf8_bin;
你可以使用 N'literal'(或 n'literal')来创建国家字符集的字符串。以下语句是等价的:
SELECT N'some text';
SELECT n'some text';
SELECT _utf8'some text';
为了在字符串中表示某些特殊字符,可以使用转义字符进行转义:
| 转义字符 | 含义 |
|---|---|
| \0 | 一个 ASCII NUL (X'00') 字符 |
| \' | 单引号 ' 字符 |
| \" | 双引号 " 字符 |
| \b | 退格字符 |
| \n | 换行符 |
| \r | 回车符 |
| \t | 制表符 |
| \z | ASCII 26 (Ctrl + Z) |
| \\ | 反斜杠 \ 字符 |
| \% | % 字符 |
| \_ | _ 字符 |
如果你想在用 ' 包裹的字符串中表示 ",或者在用 " 包裹的字符串中表示 ',则无需使用转义字符。
更多信息请参见 MySQL 字符串字面值。
数值字面值
数值字面值包括整数和 DECIMAL 字面值以及浮点字面值。
整数可以包含 . 作为小数分隔符。数字前可以加 - 或 +,分别表示负值或正值。
精确值数值字面值可以表示为 1, .2, 3.4, -5, -6.78, +9.10。
数值字面值也可以用科学计数法表示,如 1.2E3, 1.2E-3, -1.2E3, -1.2E-3。
更多信息请参见 MySQL 数值字面值。
日期和时间字面值
日期和时间字面值可以用多种格式表示,如带引号的字符串或数字。当 TiDB 期望一个日期时,会将 '2017-08-24'、'20170824' 和 20170824 都解释为日期。
TiDB 支持以下日期格式:
'YYYY-MM-DD'或'YY-MM-DD':此处的-分隔符并不严格,可以是任意标点。例如,'2017-08-24'、'2017&08&24'、'2012@12^31'都是合法的日期格式。唯一特殊的标点是.,它被视为小数点,用于分隔整数和小数部分。日期和时间可以用T或空格分隔。例如,2017-8-24 10:42:00和2017-8-24T10:42:00表示相同的日期和时间。'YYYYMMDDHHMMSS'或'YYMMDDHHMMSS':例如,'20170824104520'和'170824104520'被视为'2017-08-24 10:45:20'。但如果你提供了超出范围的值,如'170824304520',则不会被视为有效日期。注意,错误的格式如YYYYMMDD HHMMSS、YYYYMMDD HH:MM:DD或YYYY-MM-DD HHMMSS会插入失败。YYYYMMDDHHMMSS或YYMMDDHHMMSS:注意这些格式没有单引号或双引号,而是数字。例如,20170824104520会被解释为'2017-08-24 10:45:20'。
DATETIME 或 TIMESTAMP 值可以带有小数部分,用于表示微秒精度(6 位)。小数部分应始终用小数点 . 与时间的其余部分分隔。
只包含两位数的年份值是有歧义的,建议使用四位数年份格式。TiDB 按以下规则解释两位数年份值:
- 如果年份值在
70-99范围内,则转换为1970-1999。 - 如果年份值在
00-69范围内,则转换为2000-2069。
对于小于 10 的月份或日期值,'2017-8-4' 与 '2017-08-04' 是等价的。时间同理,例如,'2017-08-24 1:2:3' 与 '2017-08-24 01:02:03' 是等价的。
当需要日期或时间值时,TiDB 会根据值的长度选择指定的格式:
- 6 位数字:
YYMMDD。 - 12 位数字:
YYMMDDHHMMSS。 - 8 位数字:
YYYYMMDD。 - 14 位数字:
YYYYMMDDHHMMSS。
TiDB 支持以下时间值格式:
'D HH:MM:SS',或'HH:MM:SS'、'HH:MM'、'D HH:MM'、'D HH'、'SS':D表示天数,合法取值范围为0-34。HHMMSS格式的数字:例如,231010被解释为'23:10:10'。- 任何
SS、MMSS和HHMMSS格式的数字都可以被视为时间。
Time 类型的小数点也是 .,小数点后最多可保留 6 位精度。
更多详情请参见 MySQL 日期和时间字面值。
布尔字面值
常量 TRUE 和 FALSE 分别等于 1 和 0,且不区分大小写。
SELECT TRUE, true, tRuE, FALSE, FaLsE, false;
+------+------+------+-------+-------+-------+
| TRUE | true | tRuE | FALSE | FaLsE | false |
+------+------+------+-------+-------+-------+
| 1 | 1 | 1 | 0 | 0 | 0 |
+------+------+------+-------+-------+-------+
1 row in set (0.00 sec)
十六进制字面值
十六进制字面值可以使用 X'val' 或 0xval 形式书写,其中 val 包含十六进制数字。前缀 0x 区分大小写,不能写作 0X。
合法的十六进制字面值:
X'ac12'
X'12AC'
x'ac12'
x'12AC'
0xac12
0x12AC
不合法的十六进制字面值:
X'1z' (z 不是合法的十六进制数字)
0X12AC (0X 必须写作 0x)
使用 X'val' 形式书写的十六进制字面值必须包含偶数位数字。如果 val 的长度为奇数(例如 X'A' 或 X'11A'),为避免语法错误,需要在前面补零:
mysql> select X'aff';
ERROR 1105 (HY000): line 0 column 13 near ""hex literal: invalid hexadecimal format, must even numbers, but 3 (total length 13)
mysql> select X'0aff';
+---------+
| X'0aff' |
+---------+
| 0x0aff |
+---------+
1 row in set (0.00 sec)
默认情况下,十六进制字面值为二进制字符串。
要将字符串或数字转换为十六进制格式的字符串,可以使用 HEX() 函数:
mysql> SELECT HEX('TiDB');
+-------------+
| HEX('TiDB') |
+-------------+
| 54694442 |
+-------------+
1 row in set (0.01 sec)
mysql> SELECT X'54694442';
+-------------+
| X'54694442' |
+-------------+
| TiDB |
+-------------+
1 row in set (0.00 sec)
位值字面值
位值字面值可以使用 b'val' 或 0bval 形式书写。val 是由 0 和 1 组成的二进制值。前缀 0b 区分大小写,不能写作 0B。
合法的位值字面值:
b'01'
B'01'
0b01
不合法的位值字面值:
b'2' (2 不是二进制数字,必须为 0 或 1)
0B01 (0B 必须写作 0b)
默认情况下,位值字面值为二进制字符串。
位值以二进制值返回,在 MySQL 客户端中可能无法很好地显示。要将位值转换为可打印的形式,可以使用如 BIN() 或 HEX() 这样的转换函数。
CREATE TABLE t (b BIT(8));
INSERT INTO t SET b = b'00010011';
INSERT INTO t SET b = b'1110';
INSERT INTO t SET b = b'100101';
mysql> SELECT b+0, BIN(b), HEX(b) FROM t;
+------+--------+--------+
| b+0 | BIN(b) | HEX(b) |
+------+--------+--------+
| 19 | 10011 | 13 |
| 14 | 1110 | E |
| 37 | 100101 | 25 |
+------+--------+--------+
3 rows in set (0.00 sec)
NULL 值
NULL 表示数据为空,不区分大小写,并且与 \N(区分大小写)同义。