MySQL關鍵字-字段名使用Usage報錯問題

1. 背景描述

前幾天遇到這麼一個問題,用navicat創建個數據表,其中有一個字段標識用量,用量嘛依照我的六級未遂的英語,Usage。嗯,這個單詞貼切,夠短,perfect!表真的創建成功了,但是插入數據時就是不對,語法錯誤!what a fuck!檢查了半天終於發現Usage這個罪魁禍首,這貨別是個關鍵字吧,查了一下,嘿,還真是,fuck again!

2. 官方文檔說明

查了一下官方文檔是這麼說的:

Keywords are words that have significance in SQL. Certain keywords, such as SELECT, DELETE, or BIGINT, are reserved and require special treatment for use as identifiers such as table and column names. This may also be true for the names of built-in functions.

關鍵字是在SQL中有意義的單詞。某些關鍵字(如SELECT、DELETE或BIGINT)是保留的,需要特殊處理才能用作表和列名等標識符。對於內置函數的名稱也可能是這樣。
Nonreserved keywords are permitted as identifiers without quoting.
不帶引號的關鍵字可以作爲標識符。

mysql> CREATE TABLE interval (begin INT, end INT);
ERROR 1064 (42000): You have an error in your SQL syntax ... near 'interval (begin INT, end INT)'

BEGIN and END are keywords but not reserved, so their use as identifiers does not require quoting. INTERVAL is a reserved keyword and must be quoted to be used as an identifier
BEGIN和END是關鍵字,但不是保留的,因此它們用作標識符不需要引用。INTERVAL是保留關鍵字,必須引用才能用作標識符

mysql> CREATE TABLE `interval` (begin INT, end INT);
Query OK, 0 rows affected (0.01 sec)

Exception: A word that follows a period in a qualified name must be an identifier, so it need not be quoted even if it is reserved
例外:限定名中句點後面的單詞必須是標識符,因此即使保留了它,也不必引用

Names of built-in functions are permitted as identifiers but may require care to be used as such. For example, COUNT is acceptable as a column name. However, by default, no whitespace is permitted in function invocations between the function name and the following ( character. This requirement enables the parser to distinguish whether the name is used in a function call or in nonfunction context.
內置函數的名稱允許作爲標識符,但可能需要謹慎使用。例如,COUNT可以作爲列名。但是,默認情況下,函數調用中函數名和以下字符之間不允許有空格。這個需求使解析器能夠區分名稱是在函數調用中使用還是在非函數上下文中使用。

3. MySQL5.7關鍵字保留字列表

下面羅列了MySQL5.7版本的關鍵字和保留字,做個筆記吧,畢竟年齡大了,記性不好,順便說一句,帶 ®標識的爲關鍵字
A

ACCESSIBLE ® ACCOUNT; added in 5.7.6 (nonreserved) ACTION ADD ® AFTER
AGAINST AGGREGATE ALGORITHM ALL ® ALTER ®
ALWAYS; added in 5.7.6 (nonreserved) ANALYSE ANALYZE ® AND ® ANY
AS ® ASC ® ASCII ASENSITIVE ® AT
AUTOEXTEND_SIZE AUTO_INCREMENT AVG AVG_ROW_LENGTH

B

ACKUP BEFORE ® BEGIN BETWEEN ® BIGINT ®
INARY ® BINLOG BIT BLOB ® BLOCK
BOOL BOOLEAN BOTH ® BTREE BY ®
BYTE

C

CACHE CALL ® CASCADE ® CASCADED CASE ®
CATALOG_NAME CHAIN CHANGE ® CHANGED CHANNEL; added in 5.7.6 (nonreserved)
CHAR ® CHARACTER ® CHARSET CHECK ® CHECKSUM
CIPHER CLASS_ORIGIN CLIENT CLOSE COALESCE
CODE COLLATE ® COLLATION COLUMN ® COLUMNS
COLUMN_FORMAT COLUMN_NAME COMMENT COMMIT COMMITTED
COMPACT COMPLETION COMPRESSED COMPRESSION; added in 5.7.8 (nonreserved) CONCURRENT
CONDITION ® CONNECTION CONSISTENT CONSTRAINT ® CONSTRAINT_CATALOG
CONSTRAINT_NAME CONSTRAINT_SCHEMA CONTAINS CONTEXT CONTINUE ®
CONVERT ® CPU CREATE ® CROSS ® CUBE
CURRENT CURRENT_DATE ® CURRENT_TIME ® CURRENT_TIMESTAMP ® CURRENT_USER ®
CURSOR ® CURSOR_NAME

D

DATA DATABASE ® DATABASES ® DATAFILE DATE
DATETIME DAY DAY_HOUR ® DAY_MICROSECOND ® DAY_MINUTE ®
DAY_SECOND ® DEALLOCATE DEC ® DECIMAL ® DECLARE ®
DEFAULT ® DEFAULT_AUTH DEFINER DELAYED ® DELAY_KEY_WRITE
DELETE ® DESC ® DESCRIBE ® DES_KEY_FILE DETERMINISTIC ®
DIAGNOSTICS DIRECTORY DISABLE DISCARD DISK
DISTINCT ® DISTINCTROW ® DIV ® DO DOUBLE ®
DROP ® DUAL ® DUMPFILE DUPLICATE DYNAMIC

E

EACH ® ELSE ® ELSEIF ® ENABLE ENCLOSED ®
ENCRYPTION; added in 5.7.11 (nonreserved) END ENDS ENGINE ENGINES
ENUM ERROR ERRORS ESCAPE ESCAPED ®
EVENT EVENTS EVERY EXCHANGE EXECUTE
EXISTS ® EXIT ® EXPANSION EXPIRE EXPLAIN ®
EXPORT EXTENDED EXTENT_SIZE

F

FALSE ® FAST FAULTS FETCH ® FIELDS
FILE FILE_BLOCK_SIZE; added in 5.7.6 (nonreserved) FILTER; added in 5.7.3 (nonreserved) FIRST FIXED
FLOAT ® FLOAT4 ® FLOAT8 ® FLUSH FOLLOWS; added in 5.7.2 (nonreserved)
FOR ® FORCE ® FOREIGN ® FORMAT FOUND
FROM ® FULL FULLTEXT ® FUNCTION

G

GENERAL GENERATED ®; added in 5.7.6 (reserved) GEOMETRY GEOMETRYCOLLECTION GET ®
GET_FORMAT GLOBAL GRANT ® GRANTS GROUP ®
GROUP_REPLICATION; added in 5.7.6 (nonreserved)

H

HANDLER HASH HAVING ® HELP HIGH_PRIORITY ®
HOST HOSTS HOUR HOUR_MICROSECOND ® HOUR_MINUTE ®
HOUR_SECOND ®

I

IDENTIFIED IF ® IGNORE ® IGNORE_SERVER_IDS IMPORT
IN ® INDEX ® INDEXES INFILE ® INITIAL_SIZE
INNER ® INOUT ® INSENSITIVE ® INSERT ® INSERT_METHOD
INSTALL INSTANCE; added in 5.7.11 (nonreserved) INT ® INT1 ® INT2 ®
INT3 ® INT4 ® INT8 ® INTEGER ® INTERVAL ®
INTO ® INVOKER IO IO_AFTER_GTIDS ® IO_BEFORE_GTIDS ®
IO_THREAD IPC IS ® ISOLATION ISSUER

J

JOIN ® JSON; added in 5.7.8 (nonreserved)

K

KEY ® KEYS ® KEY_BLOCK_SIZE KILL ®

L

LANGUAGE LAST LEADING ® LEAVE ® LEAVES
LEFT ® LESS LEVEL LIKE ® LIMIT ®
INEAR ® LINES ® LINESTRING LIST LOAD ®
LOCAL LOCALTIME ® LOCALTIMESTAMP ® LOCK ® LOCKS
LOGFILE LOGS LONG ® LONGBLOB ® LONGTEXT ®
LOOP ® LOW_PRIORITY ®

M

MASTER MASTER_AUTO_POSITION MASTER_BIND ® MASTER_CONNECT_RETRY MASTER_DELAY
MASTER_HEARTBEAT_PERIOD MASTER_HOST MASTER_LOG_FILE MASTER_LOG_POS MASTER_PASSWORD
MASTER_PORT MASTER_RETRY_COUNT MASTER_SERVER_ID MASTER_SSL MASTER_SSL_CA
MASTER_SSL_CAPATH MASTER_SSL_CERT MASTER_SSL_CIPHER MASTER_SSL_CRL MASTER_SSL_CRLPATH
MASTER_SSL_KEY MASTER_SSL_VERIFY_SERVER_CERT ® MASTER_TLS_VERSION; added in 5.7.10 (nonreserved) MASTER_USER MATCH ®
MAXVALUE ® MAX_CONNECTIONS_PER_HOUR MAX_QUERIES_PER_HOUR MAX_ROWS MAX_SIZE
MAX_STATEMENT_TIME; added in 5.7.4 (nonreserved); removed in 5.7.8 MAX_UPDATES_PER_HOUR MAX_USER_CONNECTIONS MEDIUM MEDIUMBLOB ®
MEDIUMINT ® MEDIUMTEXT ® MEMORY MERGE MESSAGE_TEXT
MICROSECOND MIDDLEINT ® MIGRATE MINUTE MINUTE_MICROSECOND ®
MINUTE_SECOND ® MIN_ROWS MOD ® MODE MODIFIES ®
MODIFY MONTH MULTILINESTRING MULTIPOINT MULTIPOLYGON
MUTEX MYSQL_ERRNO

N

NAME NAMES NATIONAL NATURAL ® NCHAR
NDB NDBCLUSTER NEVER; added in 5.7.4 (nonreserved) NEW NEXT
NO NODEGROUP NONBLOCKING; removed in 5.7.6 NONE NOT ®
NO_WAIT NO_WRITE_TO_BINLOG ® NULL ® NUMBER NUMERIC ®
NVARCHAR

O

OFFSET OLD_PASSWORD; removed in 5.7.5 ON ® ONE ONLY
OPEN OPTIMIZE ® OPTIMIZER_COSTS ®; added in 5.7.5 (reserved) OPTION ® OPTIONALLY ®
OPTIONS OR ® ORDER ® OUT ® OUTER ®
OUTFILE ® OWNER

P

PACK_KEYS PAGE PARSER PARSE_GCOL_EXPR; added in 5.7.6 (reserved); became nonreserved in 5.7.8 PARTIAL
PARTITION ® PARTITIONING PARTITIONS PASSWORD PHASE
PLUGIN PLUGINS PLUGIN_DIR POINT POLYGON
PORT PRECEDES; added in 5.7.2 (nonreserved) PRECISION ® PREPARE PRESERVE
PREV PRIMARY ® PRIVILEGES PROCEDURE ® PROCESSLIST
PROFILE PROFILES PROXY PURGE ®

Q

QUARTER QUERY QUICK

R

RANGE ® READ ® READS ® READ_ONLY READ_WRITE ®
REAL ® REBUILD RECOVER REDOFILE REDO_BUFFER_SIZE
REDUNDANT REFERENCES ® REGEXP ® RELAY RELAYLOG
RELAY_LOG_FILE ELAY_LOG_POS RELAY_THREAD RELEASE ®
RELOAD REMOVE RENAME ® REORGANIZE REPAIR
REPEAT ® REPEATABLE REPLACE ® REPLICATE_DO_DB; added in 5.7.3 (nonreserved) REPLICATE_DO_TABLE; added in 5.7.3 (nonreserved)
REPLICATE_IGNORE_DB; added in 5.7.3 (nonreserved) REPLICATE_IGNORE_TABLE; added in 5.7.3 (nonreserved) REPLICATE_REWRITE_DB; added in 5.7.3 (nonreserved) REPLICATE_WILD_DO_TABLE; added in 5.7.3 (nonreserved) REPLICATE_WILD_IGNORE_TABLE; added in 5.7.3 (nonreserved)
REPLICATION REQUIRE ® RESET RESIGNAL ® RESTORE
RESTRICT ® RESUME RETURN ® RETURNED_SQLSTATE RETURNS
REVERSE REVOKE ® RIGHT ® RLIKE ® ROLLBACK
ROLLUP ROTATE; added in 5.7.11 (nonreserved) ROUTINE ROW ROWS
ROW_COUNT ROW_FORMAT RTREE

S

SAVEPOINT SCHEDULE SCHEMA ® SCHEMAS ® SCHEMA_NAME
SECOND SECOND_MICROSECOND ® SECURITY SELECT ® SENSITIVE ®
SEPARATOR ® SERIAL SERIALIZABLE SERVER SESSION
SET ® SHARE SHOW ® SHUTDOWN SIGNAL ®
SIGNED SIMPLE SLAVE SLOW SMALLINT ®
SNAPSHOT SOCKET SOME SONAME SOUNDS
SOURCE SPATIAL ® SPECIFIC ® SQL ® SQLEXCEPTION ®
SQLSTATE ® SQLWARNING ® SQL_AFTER_GTIDS SQL_AFTER_MTS_GAPS SQL_BEFORE_GTIDS
SQL_BIG_RESULT ® SQL_BUFFER_RESULT SQL_CACHE SQL_CALC_FOUND_ROWS ® SQL_NO_CACHE
SQL_SMALL_RESULT ® SQL_THREAD SQL_TSI_DAY SQL_TSI_HOUR SQL_TSI_MINUTE
SQL_TSI_MONTH SQL_TSI_QUARTER SQL_TSI_SECOND SQL_TSI_WEEK SQL_TSI_YEAR
SSL ® STACKED START STARTING ® STARTS
STATS_AUTO_RECALC STATS_PERSISTENT STATS_SAMPLE_PAGES STATUS STOP
STORAGE STORED ®; added in 5.7.6 (reserved) STRAIGHT_JOIN ® STRING SUBCLASS_ORIGIN
SUBJECT SUBPARTITION SUBPARTITIONS SUPER SUSPEND
SWAPS SWITCHES

T

TABLE ® TABLES TABLESPACE TABLE_CHECKSUM TABLE_NAME
TEMPORARY TEMPTABLE TERMINATED ® TEXT THAN
THEN ® TIME TIMESTAMP TIMESTAMPADD TIMESTAMPDIFF
TINYBLOB ® TINYINT ® TINYTEXT ® TO ® TRAILING ®
TRANSACTION TRIGGER ® TRIGGERS TRUE ® TRUNCATE
TYPE TYPES

U

UNCOMMITTED UNDEFINED UNDO ® UNDOFILE UNDO_BUFFER_SIZE
UNICODE UNINSTALL UNION ® UNIQUE ® UNKNOWN
UNLOCK ® UNSIGNED ® UNTIL UPDATE ® UPGRADE
USAGE ® USE ® USER USER_RESOURCES USE_FRM
USING ® UTC_DATE ® UTC_TIME ® UTC_TIMESTAMP ®

V

VALIDATION; added in 5.7.5 (nonreserved) VALUE VALUES ® VARBINARY ® VARCHAR ®
VARCHARACTER ® VARIABLES VARYING ® VIEW VIRTUAL ®; added in 5.7.6 (reserved)

W

WAIT WARNINGS WEEK WEIGHT_STRING WHEN ®
WHERE ® WHILE ® WITH ® WITHOUT; added in 5.7.5 (nonreserved) WORK
WRAPPER WRITE ®

X

X509 XA XID; added in 5.7.5 (nonreserved) XML XOR ®

Y

YEAR YEAR_MONTH ®

Z

ZEROFILL ®

4. 總結

MySQL關鍵字很多,大部分關鍵字可以直接用作表名或者字段名,但是保留字必須用引號包含纔可以使用。但是還是能不用盡量不用吧,畢竟麻煩,打斷sql多一個少一個引號根本注意不到好嗎?!!你可以做但沒必要~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章