萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 保留字與關鍵字完整參考表(含可作標識符的例外)

前言

MySQL 保留字/關鍵字不可直接作為表名、列名、別名等標識符,除非用反引號 ` 包裹。本文提供完整分類列表,並標註允許作為非引用標識符的關鍵字,方便開發命名避坑。

一、核心保留字(必須加反引號)

以下關鍵字在所有版本中均為保留字,直接使用會報語法錯誤:


ADD, ALL, ALTER, ANALYZE, AND, AS, ASC, ASENSITIVE, BEFORE, BETWEEN,
BIGINT, BINARY, BLOB, BOTH, BY, CALL, CASCADE, CASE, CHANGE, CHAR,
CHARACTER, CHECK, COLLATE, COLUMN, CONDITION, CONNECTION, CONSTRAINT,
CONTINUE, CONVERT, CREATE, CROSS, CURRENT_DATE, CURRENT_TIME,
CURRENT_TIMESTAMP, CURRENT_USER, CURSOR, DATABASE, DATABASES,
DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEC, DECIMAL,
DECLARE, DEFAULT, DELAYED, DELETE, DESC, DESCRIBE, DETERMINISTIC,
DISTINCT, DISTINCTROW, DIV, DOUBLE, DROP, DUAL, EACH, ELSE, ELSEIF,
ENCLOSED, ESCAPED, EXISTS, EXIT, EXPLAIN, FALSE, FETCH, FLOAT,
FLOAT4, FLOAT8, FOR, FORCE, FOREIGN, FROM, FULLTEXT, GOTO, GRANT,
GROUP, HAVING, HIGH_PRIORITY, HOUR_MICROSECOND, HOUR_MINUTE,
HOUR_SECOND, IF, IGNORE, IN, INDEX, INFILE, INNER, INOUT, INSENSITIVE,
INSERT, INT, INT1, INT2, INT3, INT4, INT8, INTEGER, INTERVAL, INTO,
IS, ITERATE, JOIN, KEY, KEYS, KILL, LABEL, LEADING, LEAVE, LEFT,
LIKE, LIMIT, LINEAR, LINES, LOAD, LOCALTIME, LOCALTIMESTAMP, LOCK,
LONG, LONGBLOB, LONGTEXT, LOOP, LOW_PRIORITY, MATCH, MEDIUMBLOB,
MEDIUMINT, MEDIUMTEXT, MIDDLEINT, MINUTE_MICROSECOND, MINUTE_SECOND,
MOD, MODIFIES, NATURAL, NOT, NO_WRITE_TO_BINLOG, NULL, NUMERIC, ON,
OPTIMIZE, OPTION, OPTIONALLY, OR, ORDER, OUT, OUTER, OUTFILE,
PRECISION, PRIMARY, PROCEDURE, PURGE, RAID0, RANGE, READ, READS,
REAL, REFERENCES, REGEXP, RELEASE, RENAME, REPEAT, REPLACE, REQUIRE,
RESTRICT, RETURN, REVOKE, RIGHT, RLIKE, SCHEMA, SCHEMAS, SECOND_MICROSECOND,
SELECT, SENSITIVE, SEPARATOR, SET, SHOW, SMALLINT, SPATIAL, SPECIFIC,
SQL, SQLEXCEPTION, SQLSTATE, SQLWARNING, SQL_BIG_RESULT, SQL_CALC_FOUND_ROWS,
SQL_SMALL_RESULT, SSL, STARTING, STRAIGHT_JOIN, TABLE, TERMINATED, THEN,
TINYBLOB, TINYINT, TINYTEXT, TO, TRAILING, TRIGGER, TRUE, UNDO, UNION,
UNIQUE, UNLOCK, UNSIGNED, UPDATE, USAGE, USE, USING, UTC_DATE, UTC_TIME,
UTC_TIMESTAMP, VALUES, VARBINARY, VARCHAR, VARCHARACTER, VARYING, WHEN,
WHERE, WHILE, WITH, WRITE, X509, XOR, YEAR_MONTH, ZEROFILL

二、非保留關鍵字(可直接作標識符,無需反引號)

MySQL 允許以下關鍵字**不加反引號**直接用作表名、列名等(為兼容舊應用):


ACTION, BIT, DATE, ENUM, NO, TEXT, TIME, TIMESTAMP

例如:CREATE TABLE date (id INT, time TIME); 合法(但不推薦,易混淆)。

三、版本新增保留字(升級需注意)

版本新增保留字示例
8.0GROUPS, RANGE, ROWS, LATERAL, RECURSIVE, QUALIFY, WINDOW, DEFINER, DEFINITION, SYSTEM, VERSIONING, VISIBLE, INVISIBLE, CLONE, COMPONENT, INSTALL, UNINSTALL, FUNCTION, PROCEDURE, TRIGGER, EVENT, ROUTINE, SCHEMAS, TABLESPACE, LOGFILE_GROUP, UNDOFILE, REDOFILE, CHECKPOINT, SNAPSHOT, BACKUP, RESTORE, REPLICA, SOURCE, CHANNEL, FAILOVER, GROUP_REPLICATION, ASYNCHRONOUS, SYNCHRONOUS, SEMI_SYNCHRONOUS, PRIMARY, SECONDARY, ARBITRATOR, MAJORITY, MINORITY, QUORUM, CONSENSUS, LEADER, FOLLOWER, CANDIDATE, VOTER, OBSERVER
5.7GENERATED, STORED, VIRTUAL, JSON, SHARDING, ZONE, RESOURCE, GROUP, MEMBER, WEIGHT, PRIMARY, SECONDARY, ARBITRATOR, MAJORITY, MINORITY, QUORUM, CONSENSUS
5.6GET, IO_AFTER_GTIDS, IO_BEFORE_GTIDS, MASTER_BIND, MASTER_COMPRESSION_ALGORITHMS, MASTER_ZSTD_COMPRESSION_LEVEL, NETWORK_NAMESPACE, OPTIMIZE, PARTITION, RANGE, ROW, SYSTEM, TABLESPACE, UNDO, VISIBLE, INVISIBLE

四、查詢當前版本完整保留字列表


-- 信息架構表(8.0+)
SELECT * FROM INFORMATION_SCHEMA.KEYWORDS WHERE RESERVED = 1;

-- 或查看官方文檔:https://dev.mysql.com/doc/refman/8.0/en/keywords.html

五、命名最佳實踐

  1. 統一加反引號:所有標識符(庫、表、列、索引、別名、變量)一律用 ` 包裹,消除保留字衝突風險。
    SELECT `id`, `name`, `from` FROM `order` WHERE `group` = 1;
  2. 避開語義衝突詞:即使非保留字,date、time、timestamp、key、index、order、group、by、select、where 等極易誤讀,**業務命名禁用**。
  3. 采用前綴/命名空間:t_user、col_created_at、idx_user_phone,降低衝突概率。
  4. 代碼生成器/ORM 自動轉義**:Hibernate、MyBatis、GORM、Django ORM 等均自動加反引號/雙引號。

六、快速檢測腳本


#!/bin/bash
# check_reserved.sh: 檢測 SQL 文件中的裸露保留字
# 依賴:mysql client, grep
SQL_FILE=$1
mysql -N -e "SELECT WORD FROM INFORMATION_SCHEMA.KEYWORDS WHERE RESERVED=1" | while read kw; do
  if grep -Ei "\b$kw\b" "$SQL_FILE" | grep -v '`'; then
    echo "WARNING: Reserved keyword '$kw' used without backticks in $SQL_FILE"
  fi
done

總結

MySQL 保留字列表龐大且隨版本增長。**統一使用反引號包裹標識符**是最簡單、最安全、跨版本兼容的策略。結合代碼審查工具自動檢測裸露保留字,可在開發期攔截 99% 命名衝突問題。

copyright © 萬盛學電腦網 all rights reserved