- 关于 TiDB
- 快速上手
- 部署标准集群
- 数据迁移
- 运维操作
- 监控与告警
- 故障诊断
- 性能调优
- 系统调优
- 软件调优
- SQL 性能调优
- SQL 性能调优概览
- 理解 TiDB 执行计划
- SQL 优化流程
- 控制执行计划
- 教程
- 同城多中心部署
- 两地三中心部署
- 同城两中心部署
- 读取历史数据
- 使用 Stale Read 功能读取历史数据(推荐)
- 使用系统变量
tidb_snapshot
读取历史数据
- 最佳实践
- Placement Rules 使用文档
- Load Base Split 使用文档
- Store Limit 使用文档
- TiDB 工具
- 功能概览
- 适用场景
- 工具下载
- TiUP
- 文档地图
- 概览
- 术语及核心概念
- TiUP 组件管理
- FAQ
- 故障排查
- TiUP 命令参考手册
- 命令概览
- TiUP 命令
- TiUP Cluster 命令
- TiUP Cluster 命令概览
- tiup cluster audit
- tiup cluster check
- tiup cluster clean
- tiup cluster deploy
- tiup cluster destroy
- tiup cluster disable
- tiup cluster display
- tiup cluster edit-config
- tiup cluster enable
- tiup cluster help
- tiup cluster import
- tiup cluster list
- tiup cluster patch
- tiup cluster prune
- tiup cluster reload
- tiup cluster rename
- tiup cluster replay
- tiup cluster restart
- tiup cluster scale-in
- tiup cluster scale-out
- tiup cluster start
- tiup cluster stop
- tiup cluster template
- tiup cluster upgrade
- TiUP DM 命令
- TiUP DM 命令概览
- tiup dm audit
- tiup dm deploy
- tiup dm destroy
- tiup dm disable
- tiup dm display
- tiup dm edit-config
- tiup dm enable
- tiup dm help
- tiup dm import
- tiup dm list
- tiup dm patch
- tiup dm prune
- tiup dm reload
- tiup dm replay
- tiup dm restart
- tiup dm scale-in
- tiup dm scale-out
- tiup dm start
- tiup dm stop
- tiup dm template
- tiup dm upgrade
- TiDB 集群拓扑文件配置
- DM 集群拓扑文件配置
- TiUP 镜像参考指南
- TiUP 组件文档
- TiDB Operator
- Dumpling
- TiDB Lightning
- TiDB Data Migration
- Backup & Restore (BR)
- TiDB Binlog
- TiCDC
- sync-diff-inspector
- TiSpark
- 参考指南
- 架构
- 监控指标
- 安全加固
- 权限
- SQL
- SQL 语言结构和语法
- SQL 语句
ADD COLUMN
ADD INDEX
ADMIN
ADMIN CANCEL DDL
ADMIN CHECKSUM TABLE
ADMIN CHECK [TABLE|INDEX]
ADMIN SHOW DDL [JOBS|QUERIES]
ADMIN SHOW TELEMETRY
ALTER DATABASE
ALTER INDEX
ALTER INSTANCE
ALTER PLACEMENT POLICY
ALTER TABLE
ALTER USER
ANALYZE TABLE
BACKUP
BEGIN
CHANGE COLUMN
CHANGE DRAINER
CHANGE PUMP
COMMIT
CREATE [GLOBAL|SESSION] BINDING
CREATE DATABASE
CREATE INDEX
CREATE PLACEMENT POLICY
CREATE ROLE
CREATE SEQUENCE
CREATE TABLE LIKE
CREATE TABLE
CREATE USER
CREATE VIEW
DEALLOCATE
DELETE
DESC
DESCRIBE
DO
DROP [GLOBAL|SESSION] BINDING
DROP COLUMN
DROP DATABASE
DROP INDEX
DROP PLACEMENT POLICY
DROP ROLE
DROP SEQUENCE
DROP STATS
DROP TABLE
DROP USER
DROP VIEW
EXECUTE
EXPLAIN ANALYZE
EXPLAIN
FLASHBACK TABLE
FLUSH PRIVILEGES
FLUSH STATUS
FLUSH TABLES
GRANT <privileges>
GRANT <role>
INSERT
KILL [TIDB]
LOAD DATA
LOAD STATS
MODIFY COLUMN
PREPARE
RECOVER TABLE
RENAME INDEX
RENAME TABLE
REPLACE
RESTORE
REVOKE <privileges>
REVOKE <role>
ROLLBACK
SELECT
SET DEFAULT ROLE
SET [NAMES|CHARACTER SET]
SET PASSWORD
SET ROLE
SET TRANSACTION
SET [GLOBAL|SESSION] <variable>
SHOW [BACKUPS|RESTORES]
SHOW ANALYZE STATUS
SHOW [GLOBAL|SESSION] BINDINGS
SHOW BUILTINS
SHOW CHARACTER SET
SHOW COLLATION
SHOW [FULL] COLUMNS FROM
SHOW CONFIG
SHOW CREATE PLACEMENT POLICY
SHOW CREATE SEQUENCE
SHOW CREATE TABLE
SHOW CREATE USER
SHOW DATABASES
SHOW DRAINER STATUS
SHOW ENGINES
SHOW ERRORS
SHOW [FULL] FIELDS FROM
SHOW GRANTS
SHOW INDEX [FROM|IN]
SHOW INDEXES [FROM|IN]
SHOW KEYS [FROM|IN]
SHOW MASTER STATUS
SHOW PLACEMENT
SHOW PLACEMENT FOR
SHOW PLACEMENT LABELS
SHOW PLUGINS
SHOW PRIVILEGES
SHOW [FULL] PROCESSSLIST
SHOW PROFILES
SHOW PUMP STATUS
SHOW SCHEMAS
SHOW STATS_HEALTHY
SHOW STATS_HISTOGRAMS
SHOW STATS_META
SHOW STATUS
SHOW TABLE NEXT_ROW_ID
SHOW TABLE REGIONS
SHOW TABLE STATUS
SHOW [FULL] TABLES
SHOW [GLOBAL|SESSION] VARIABLES
SHOW WARNINGS
SHUTDOWN
SPLIT REGION
START TRANSACTION
TABLE
TRACE
TRUNCATE
UPDATE
USE
WITH
- 数据类型
- 函数与操作符
- 聚簇索引
- 约束
- 生成列
- SQL 模式
- 表属性
- 事务
- 垃圾回收 (GC)
- 视图
- 分区表
- 临时表
- 字符集和排序
- Placement Rules in SQL
- 系统表
mysql
- INFORMATION_SCHEMA
- Overview
ANALYZE_STATUS
CLIENT_ERRORS_SUMMARY_BY_HOST
CLIENT_ERRORS_SUMMARY_BY_USER
CLIENT_ERRORS_SUMMARY_GLOBAL
CHARACTER_SETS
CLUSTER_CONFIG
CLUSTER_HARDWARE
CLUSTER_INFO
CLUSTER_LOAD
CLUSTER_LOG
CLUSTER_SYSTEMINFO
COLLATIONS
COLLATION_CHARACTER_SET_APPLICABILITY
COLUMNS
DATA_LOCK_WAITS
DDL_JOBS
DEADLOCKS
ENGINES
INSPECTION_RESULT
INSPECTION_RULES
INSPECTION_SUMMARY
KEY_COLUMN_USAGE
METRICS_SUMMARY
METRICS_TABLES
PARTITIONS
PLACEMENT_RULES
PROCESSLIST
REFERENTIAL_CONSTRAINTS
SCHEMATA
SEQUENCES
SESSION_VARIABLES
SLOW_QUERY
STATISTICS
TABLES
TABLE_CONSTRAINTS
TABLE_STORAGE_STATS
TIDB_HOT_REGIONS
TIDB_HOT_REGIONS_HISTORY
TIDB_INDEXES
TIDB_SERVERS_INFO
TIDB_TRX
TIFLASH_REPLICA
TIKV_REGION_PEERS
TIKV_REGION_STATUS
TIKV_STORE_STATUS
USER_PRIVILEGES
VIEWS
METRICS_SCHEMA
- UI
- CLI
- 命令行参数
- 配置文件参数
- 系统变量
- 存储引擎
- 遥测
- 错误码
- 通过拓扑 label 进行副本调度
- 常见问题解答 (FAQ)
- 版本发布历史
- 术语表
字面值
TiDB 字面值包括字符字面值、数值字面值、时间日期字面值、十六进制、二进制字面值和 NULL 字面值。以下分别对这些字面值进行一一介绍。
String Literals
String Literals 是一个 bytes 或者 characters 的序列,两端被单引号 '
或者双引号 "
包围,例如:
'example string'
"example string"
如果字符串是连续的,会被合并为一个独立的 string。以下表示是一样的:
'a string'
'a' ' ' 'string'
"a" ' ' "string"
如果开启了 ANSI_QUOTES
SQL MODE,那么只有单引号内的会被认为是 String Literals,对于双引号内的字符串,会被认为是一个 identifier。
字符串分为以下两种:
- 二进制字符串 (binary string):由字节序列构成,它的 charset 和 collation 都是
binary
,在互相比较时利用字节作为单位。 - 非二进制字符串:由字符序列构成,有除
binary
以外的多种 charset 和 collation,在相互比较时用字符(一个字符可能包含多个字节,取决于 charset 的选择)作为单位。
一个 String Literal 可以拥有一个可选的 character set introducer
和 COLLATE clause
,可以用来指定特定的 charset 和 collation。
[_charset_name]'string' [COLLATE collation_name]
例如:
SELECT _latin1'string';
SELECT _binary'string';
SELECT _utf8'string' COLLATE utf8_bin;
你可以使用 N'literal'
或者 n'literal'
来创建使用 national character set 的字符串,下列语句是一样的:
SELECT N'some text';
SELECT n'some text';
SELECT _utf8'some text';
要在字符串中表示某些特殊字符,可以利用转义字符进行转义:
转义字符 | 含义 |
---|---|
\0 | ASCII NUL (X'00') 字符 |
\' | 单引号 |
\" | 双引号 |
\b | 退格符号 |
\n | 换行符 |
\r | 回车符 |
\t | tab 符(制表符) |
\z | ASCII 26 (Ctrl + Z) |
\\ | 反斜杠 \ |
\% | \% |
\_ | _ |
如果要在 '
包围的字符串中表示 "
,或者在 "
包围的字符串中表示 '
,可以不使用转义字符。
更多细节见 MySQL 官方文档。
Numeric Literals
数值字面值包括 integer 跟 Decimal 类型跟浮点数字面值。
integer 可以包括 .
作为小数点分隔,数字前可以有 -
或者 +
来表示正数或者负数。
精确数值字面值可以表示为如下格式:1, .2, 3.4, -5, -6.78, +9.10
.
科学记数法也是被允许的,表示为如下格式:1.2E3, 1.2E-3, -1.2E3, -1.2E-3
。
更多细节见 MySQL 官方文档。
Date and Time Literals
Date 跟 Time 字面值有几种格式,例如用字符串表示,或者直接用数字表示。在 TiDB 里面,当 TiDB 期望一个 Date 的时候,它会把 '2017-08-24'
,'20170824'
,20170824
当做是 Date。
TiDB 的 Date 值有以下几种格式:
'YYYY-MM-DD'
或者'YY-MM-DD'
,这里的-
分隔符并不是严格的,可以是任意的标点符号。比如'2017-08-24'
,'2017&08&24'
,'2012@12^31'
都是一样的。唯一需要特别对待的是 '.' 号,它被当做是小数点,用于分隔整数和小数部分。Date 和 Time 部分可以被 'T' 分隔,它的作用跟空格符是一样的,例如
2017-8-24 10:42:00
跟2017-8-24T10:42:00
是一样的。'YYYYMMDDHHMMSS'
或者'YYMMDDHHMMSS'
,例如'20170824104520'
和'170824104520'
被当做是'2017-08-24 10:45:20'
,但是如果你提供了一个超过范围的值,例如'170824304520'
,那这就不是一个有效的 Date 字面值。需要注意YYYYMMDD HHMMSS
,YYYYMMDD HH:MM:DD
,YYYY-MM-DD HHMMSS
等不正确的格式会插入失败。YYYYMMDDHHMMSS
或者YYMMDDHHMMSS
,注意这里没有单引号或者双引号,是一个数字。例如20170824104520
表示为'2017-08-24 10:45:20'
。
DATETIME 或者 TIMESTAMP 值可以接一个小数部分,用来表示微秒(精度最多到小数点后 6 位),用小数点 .
分隔。
如果 Date 的 year 部分只有两个数字,这是有歧义的(推荐使用四个数字的格式),TiDB 会尝试用以下的规则来解释:
- year 值如果在
70-99
范围,那么被转换成1970-1999
。 - year 值如果在
00-69
范围,那么被转换成2000-2069
。
对于小于 10 的 month 或者 day 值,'2017-8-4'
跟 '2017-08-04'
是一样的。对于 Time 也是一样,比如 '2017-08-24 1:2:3'
跟 '2017-08-24 01:02:03'
是一样的。
在需要 Date 或者 Time 的语境下,对于数值,TiDB 会根据数值的长度来选定指定的格式:
- 6 个数字,会被解释为
YYMMDD
。 - 12 个数字,会被解释为
YYMMDDHHMMSS
。 - 8 个数字,会解释为
YYYYMMDD
。 - 14 个数字,会被解释为
YYYYMMDDHHMMSS
。
对于 Time 类型,TiDB 用以下格式来表示:
'D HH:MM:SS'
,或者'HH:MM:SS'
,'HH:MM'
,'D HH:MM'
,'D HH'
,'SS'
。这里的 D 表示 days,合法的范围是0-34
。- 数值
HHMMSS
,例如231010
被解释为'23:10:10'
。 - 数值
SS
,MMSS
,HHMMSS
都是可以被当做 Time。
Time 类型的小数点也是 .
,精度最多小数点后 6 位。
更多细节见 MySQL 官方文档。
Boolean Literals
常量 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)
Hexadecimal Literals
十六进制字面值是有 X
和 0x
前缀的字符串,后接表示十六进制的数字。注意 0x
是大小写敏感的,不能表示为 0X
。
例如:
X'ac12'
X'12AC'
x'ac12'
x'12AC'
0xac12
0x12AC
以下是不合法的十六进制字面值:
X'1z' (z 不是合法的十六进制值)
0X12AC (0X 必须用小写的 0x)
对于使用 X'val'
格式的十六进制字面值,val
必须包含偶数个字符,如果 val
的长度是奇数(比如 X'A'、X'11A'),可以在前面补一个 0 来避免语法错误。
select X'aff';
ERROR 1105 (HY000): line 0 column 13 near ""hex literal: invalid hexadecimal format, must even numbers, but 3 (total length 13)
select X'0aff';
+---------+
| X'0aff' |
+---------+
| 0x0aff |
+---------+
1 row in set (0.00 sec)
默认情况,十六进制字面值是一个二进制字符串。
如果需要将一个字符串或者数字转换为十六进制字面值,可以使用内建函数 HEX()
:
SELECT HEX('TiDB');
+-------------+
| HEX('TiDB') |
+-------------+
| 54694442 |
+-------------+
1 row in set (0.01 sec)
SELECT X'54694442';
+-------------+
| X'54694442' |
+-------------+
| TiDB |
+-------------+
1 row in set (0.00 sec)
Bit-Value Literals
位值字面值用 b
或者 0b
做前缀,后接以 0 和 1 组成的二进制数字。其中 0b
是区分大小写的,0B
则会报错。
合法的 Bit-value:
- b'01'
- B'01'
- 0b01
非法的 Bit-value:
b'2'
(2 不是二进制数值,必须为 0 或 1)0B01
(0B 必须是小写 0b)
默认情况,位值字面值是一个二进制字符串。
Bit-value 是作为二进制返回的,所以输出到 MySQL Client 可能会无法显示,如果要转换为可打印的字符,可以使用内建函数 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';
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 Values
NULL
代表数据为空,它是大小写不敏感的,与 \N
(大小写敏感)同义。
NULL
跟 0
并不一样,跟空字符串 ''
也不一样。