关键字在 SQL 中有特殊的意义, 例如 SELECT,UPDATE,DELETE,在作为表名跟函数名的时候,需要特殊对待,例如作为表名,保留字需要被反引号包住:
CREATE TABLE select (a INT);
ERROR 1105 (HY000): line 0 column 19 near " (a INT)" (total length 27)
CREATE TABLE `select` (a INT);
Query OK, 0 rows affected (0.09 sec)
BEGIN 和 END 是关键字, 但不是保留字,所以不需要反引号:
CREATE TABLE `select` (BEGIN int, END int);
Query OK, 0 rows affected (0.09 sec)
有一种特殊情况, 如果使用了限定符 .,那么也不需要用反引号:
CREATE TABLE test.select (BEGIN int, END int);
Query OK, 0 rows affected (0.08 sec)
下表列出了在 TiDB 中的关键字跟保留字,保留字用 ® 来标识:
TiDB 支持三种注释风格:
SELECT 1+1; # 注释文字
+------+
| 1+1 |
+------+
| 2 |
+------+
1 row in set (0.00 sec)
SELECT 1+1; -- 注释文字
+------+
| 1+1 |
+------+
| 2 |
+------+
1 row in set (0.00 sec)
SELECT 1 /* 这是行内注释文字 */ + 1;
+--------+
| 1 + 1 |
+--------+
| 2 |
+--------+
1 row in set (0.01 sec)
SELECT 1+
-> /*
/*> 这是一条
/*> 多行注释
/*> */
-> 1;
+-------+
| 1+
1 |
+-------+
| 2 |
+-------+
1 row in set (0.00 sec)
SELECT 1+1--1;
+--------+
| 1+1--1 |
+--------+
| 3 |
+--------+
1 row in set (0.01 sec)
TiDB 也跟 MySQL 保持一致,支持一种 C 风格注释的变体:
/*! Specific code */
在这种格式中,TiDB 会执行注释中的语句,这个语法是为了让这些 SQL 在其他的数据库中被忽略,而在 TiDB 中被执行。
例如:SELECT /*! STRAIGHT_JOIN */ col1 FROM table1,table2 WHERE ...
在 TiDB 中,这种写法等价于 SELECT STRAIGHT_JOIN col1 FROM table1,table2 WHERE …
如果注释中指定了 Server 版本号,例如 /*!50110 KEY_BLOCK_SIZE=1024 */
,在 MySQL 中表示只有 MySQL 的版本大于等于 5.1.10 才会处理这个 comment 中的内容。但是在 TiDB 中,这个版本号不会起作用,所有的 comment 都会处理。
还有一种注释会被当做是优化器 Hint 特殊对待:
SELECT /*+ hint */ FROM ...;
由于 hint 包含在类似 /*+ xxx */ 的 comment 里,MySQL 客户端在 5.7.7 之前,会默认把 comment 清除掉,如果需要在旧的客户端使用 hint,需要在启动客户端时加上 –comments 选项,例如 mysql -h 127.0.0.1 -P 4000 -uroot –comments