数据库的关键字和保留字
所属分类 architecture
浏览量 7
关键字是统称,保留字是关键字里 “管得最严、必须加引号才能当字段名” 的那一类。
一. 官方定义区别
关键字(Keyword)
数据库语法里有特殊含义的单词
比如:SELECT、FROM、WHERE、YEAR_MONTH、TYPE
大部分可以不加引号直接当字段名,不会报错
保留字(Reserved Word)
属于关键字的子集
语法层面被数据库强行占用
直接当字段名会直接报语法错误
必须用包裹符:
MySQL / TiDB:反引号 `
人大金仓 / PostgreSQL / Oracle:双引号 "
二. 最直观的区别(实战)
不是保留字的关键字(可以直接用)
-- 可以正常执行
CREATE TABLE t (TYPE VARCHAR(20));
TYPE 是关键字,但不是保留字,所以不报错。
是保留字(必须加引号)
-- 报错,因为 TABLE 是保留字
CREATE TABLE t (TABLE VARCHAR(20));
-- 加包裹符才能用
CREATE TABLE t (`TABLE` VARCHAR(20)); -- TiDB/MySQL
CREATE TABLE t ("TABLE" VARCHAR(20)); -- Kingbase/PostgreSQL
三. 实际案例 YEAR_MONTH
在 TiDB / MySQL 里:
YEAR_MONTH 是 保留字(RESERVED=1)
直接用会报语法错误
在 人大金仓 里:
属于关键字,但不是严格保留字
但因为是内置类型别名,依然容易冲突
从 Kingbase 切 TiDB 后才突然报错。
四 查看关键字有哪些
-- TiDB / MySQL 8.0+
SELECT
WORD,
RESERVED,
CASE WHEN RESERVED=1 THEN '保留字' ELSE '关键字' END AS TYPE
FROM INFORMATION_SCHEMA.KEYWORDS
WHERE WORD IN ('SELECT', 'TABLE', 'YEAR_MONTH', 'TYPE');
RESERVED = 1 → 保留字
RESERVED = 0 → 普通关键字
人大金仓
SELECT * FROM pg_get_keywords();
五 mybatis-flex 关键字包裹 配置
# TiDB 环境(推荐)
mybatis-flex:
wrap-keywords: true
# wrap-symbol: 不用配,自动用反引号
db-type: tidb
# 人大金仓环境(旧库)
mybatis-flex:
wrap-keywords: true
# wrap-symbol: 不用配,自动用双引号
db-type: kingbasees
mybatis-flex.wrap-symbol 手动指定的固定符号(" 或 `)。
MyBatis-Flex 会根据 db-type 自动决定默认包裹符
(不需要配 wrap-symbol !!!)
MySQL / TiDB / MariaDB:默认 反引号 `
PostgreSQL / Oracle / 人大金仓 / DB2:默认 双引号 "
配置 wrap-keywords: true 即可,
不用手动写 wrap-symbol,框架会按数据库自动选。
主流数据库
mysql — MySQL
tidb — TiDB(推荐)
mariadb — MariaDB
postgresql — PostgreSQL
oracle — Oracle 11g 及以下
oracle12c — Oracle 12c+
sqlserver — SQL Server
kingbasees — 人大金仓(你的旧库)
dm — 达梦
h2 — H2
sqlite — SQLite
db2 — DB2
clickhouse — ClickHouse
opengauss — openGauss
gauss — GaussDB
上一篇
经济学史上最激动人心的思想碰撞
经济学经典名言的智慧
胜者成事的人性规则