📣
TiDB Cloud Essential 开放公测中。此页面由 AI 自动翻译,英文原文请见此处。

字面值

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制表符
\zASCII 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:002017-8-24T10:42:00 表示相同的日期和时间。
  • 'YYYYMMDDHHMMSS''YYMMDDHHMMSS':例如,'20170824104520''170824104520' 被视为 '2017-08-24 10:45:20'。但如果你提供了超出范围的值,如 '170824304520',则不会被视为有效日期。注意,错误的格式如 YYYYMMDD HHMMSSYYYYMMDD HH:MM:DDYYYY-MM-DD HHMMSS 会插入失败。
  • YYYYMMDDHHMMSSYYMMDDHHMMSS:注意这些格式没有单引号或双引号,而是数字。例如,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'
  • 任何 SSMMSSHHMMSS 格式的数字都可以被视为时间。

Time 类型的小数点也是 .,小数点后最多可保留 6 位精度。

更多详情请参见 MySQL 日期和时间字面值

布尔字面值

常量 TRUEFALSE 分别等于 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(区分大小写)同义。

文档内容是否有帮助?