§ 保留字、关键字
在 GreatSQL 中,保留字(Reserved Words) 和 关键字(Keywords) 通常有特殊意义,比如SELECT/DELETE/BIGINT 都是保留字。
当使用这些保留字(Reserved Words)作为表名、列名、内置函数名等对象名情况下,需要特殊处理才行(通常建议加上反引号"`"),避免报SQL语法错误。
当使用关键字(Keywords)作为表明、列名、内置函数名等对象名时,无需特殊处理,不会报 SQL 语法错误。
如下面的例子:
greatsql> CREATE TABLE interval (begin INT, end INT);
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'interval (begin INT, end INT)' at line 1
1
2
2
这是因为 interval 是保留字,需要用 "`" 引用包括才行,而 begin/end 只是关键字,不需要特殊处理,修改如下:
greatsql> CREATE TABLE `interval`(begin INT, end INT);
Query OK, 0 rows affected (0.08 sec)
1
2
2
另外,要注意的是,从 GreatSQL 8.0.32-24 开始,开启 Oracle 兼容模式(SET sql_mode=ORACLE)后,对象名都需要特殊处理才行,例如:
greatsql> CREATE TABLE `interval`(`begin` INT, `end` INT);
Query OK, 0 rows affected (0.02 sec)
1
2
2
或
greatsql> CREATE TABLE "interval"("begin" INT, "end" INT);
Query OK, 0 rows affected (0.02 sec)
1
2
2
在上面的两个例子中,用双引号 " 或 ` 均可。
综上,强烈建议在 SQL 开发、编写 SQL 语句时,对象名都用 " 或 ` 将其引用起来,避免报 SQL 语法错误,保证应用程序的容错性。
通过查询视图 information_schema.KEYWORDS 也可以找到保留字和关键字的信息(其中RESERVED=1的表示是保留字,其余是关键字):
greatsql> SELECT * FROM information_schema.KEYWORDS WHERE WORD LIKE '%int%';
+----------------------------------------+----------+
| WORD | RESERVED |
+----------------------------------------+----------+
| ACCESSIBLE | 1 |
| ACCOUNT | 0 |
| ACTION | 0 |
| ACTIVE | 0 |
| ADD | 1 |
| ADMIN | 0 |
...
| XML | 0 |
| XOR | 1 |
| YEAR | 0 |
| YEAR_MONTH | 1 |
| ZEROFILL | 1 |
| ZONE | 0 |
+----------------------------------------+----------+
766 rows in set (0.00 sec)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
其中,GreatSQL 相对 MySQL 新增的保留字、关键字如下:
+----------------------------------------+----------+
| WORD | RESERVED |
+----------------------------------------+----------+
| BASED | 0 |
| BINARY_DOUBLE | 1 |
| BINARY_FLOAT | 1 |
| BINARY_INTEGER | 0 |
| BODY | 0 |
| BUILD | 0 |
| CLIENT_STATISTICS | 0 |
| CLOB | 1 |
| CLUSTERING | 1 |
| COLLECT | 0 |
| COMPLETE | 0 |
| COMPRESSION_DICTIONARY | 0 |
| CONNECT | 0 |
| CONNECT_BY_ISCYCLE | 1 |
| CONNECT_BY_ISLEAF | 1 |
| CONNECT_BY_ROOT | 1 |
| CYCLE | 0 |
| DEFERRED | 0 |
| DELETING | 0 |
| DEMAND | 0 |
| EFFECTIVE | 0 |
| ELSIF | 0 |
| EXCEPTION | 0 |
| EXTERNAL | 0 |
| FORALL | 0 |
| GOTO | 0 |
| IMMEDIATE | 0 |
| INCREMENT | 0 |
| INDEX_STATISTICS | 0 |
| INSERTING | 0 |
| ISOPEN | 0 |
| KEEP | 1 |
| LOCATION | 0 |
| MATCHED | 1 |
| MATERIALIZED | 0 |
| MINUS | 1 |
| MINVALUE | 0 |
| MONTHS_BETWEEN | 0 |
| NOCACHE | 0 |
| NOCYCLE | 0 |
| NOMAXVALUE | 0 |
| NOMINVALUE | 0 |
| NOORDER | 0 |
| NOTFOUND | 0 |
| NVARCHAR2 | 0 |
| OBJECT | 0 |
| PERCENT | 0 |
| PERCONA_SEQUENCE_TABLE | 1 |
| PIVOT | 0 |
| PLAN | 1 |
| PLS_INTEGER | 1 |
| PRAGMA | 0 |
| PRIOR | 1 |
| PRIVATE | 0 |
| PUBLIC | 0 |
| RAISE | 0 |
| RATIO_TO_REPORT | 1 |
| RAW | 0 |
| RECORD | 0 |
| REF | 0 |
| REFRESH | 0 |
| ROWCOUNT | 0 |
| ROWNUM | 1 |
| ROWTYPE | 0 |
| SEQUENCE | 0 |
| SEQUENCES | 0 |
| SEQUENCE_TABLE | 0 |
| SERVEROUTPUT | 0 |
| SQLCODE | 0 |
| SQLERRM | 0 |
| START_LSN | 0 |
| SYNONYM | 0 |
| SYNONYMS | 0 |
| SYSDATE | 0 |
| SYSTIMESTAMP | 0 |
| SYS_REFCURSOR | 0 |
| TABLE_STATISTICS | 0 |
| THREAD_STATISTICS | 0 |
| TRACK | 0 |
| UPDATING | 0 |
| USER_STATISTICS | 0 |
| VARCHAR2 | 1 |
| VARRAY | 1 |
| WITHIN | 1 |
+----------------------------------------+----------+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
在使用过程中请注意上述保留字、关键字,默认都用 " 或 ` 将其引用起来,避免报 SQL 语法错误,保证应用程序的容错性。
扫码关注微信公众号
