MySQL关键字-字段名使用Usage报错问题

本文详细解析了MySQL中的关键字和保留字,包括如何在表名和字段名中正确使用这些关键字,以及在SQL语句中遇到语法错误时如何排查问题。特别提到了在Navicat中创建数据表时,字段名“Usage”因被MySQL识别为关键字而引发的错误案例。

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)ACTIONADD ®AFTER
AGAINSTAGGREGATEALGORITHMALL ®ALTER ®
ALWAYS; added in 5.7.6 (nonreserved)ANALYSEANALYZE ®AND ®ANY
AS ®ASC ®ASCIIASENSITIVE ®AT
AUTOEXTEND_SIZEAUTO_INCREMENTAVGAVG_ROW_LENGTH

B

ACKUPBEFORE ®BEGINBETWEEN ®BIGINT ®
INARY ®BINLOGBITBLOB ®BLOCK
BOOLBOOLEANBOTH ®BTREEBY ®
BYTE

C

CACHECALL ®CASCADE ®CASCADEDCASE ®
CATALOG_NAMECHAINCHANGE ®CHANGEDCHANNEL; added in 5.7.6 (nonreserved)
CHAR ®CHARACTER ®CHARSETCHECK ®CHECKSUM
CIPHERCLASS_ORIGINCLIENTCLOSECOALESCE
CODECOLLATE ®COLLATIONCOLUMN ®COLUMNS
COLUMN_FORMATCOLUMN_NAMECOMMENTCOMMITCOMMITTED
COMPACTCOMPLETIONCOMPRESSEDCOMPRESSION; added in 5.7.8 (nonreserved)CONCURRENT
CONDITION ®CONNECTIONCONSISTENTCONSTRAINT ®CONSTRAINT_CATALOG
CONSTRAINT_NAMECONSTRAINT_SCHEMACONTAINSCONTEXTCONTINUE ®
CONVERT ®CPUCREATE ®CROSS ®CUBE
CURRENTCURRENT_DATE ®CURRENT_TIME ®CURRENT_TIMESTAMP ®CURRENT_USER ®
CURSOR ®CURSOR_NAME

D

DATADATABASE ®DATABASES ®DATAFILEDATE
DATETIMEDAYDAY_HOUR ®DAY_MICROSECOND ®DAY_MINUTE ®
DAY_SECOND ®DEALLOCATEDEC ®DECIMAL ®DECLARE ®
DEFAULT ®DEFAULT_AUTHDEFINERDELAYED ®DELAY_KEY_WRITE
DELETE ®DESC ®DESCRIBE ®DES_KEY_FILEDETERMINISTIC ®
DIAGNOSTICSDIRECTORYDISABLEDISCARDDISK
DISTINCT ®DISTINCTROW ®DIV ®DODOUBLE ®
DROP ®DUAL ®DUMPFILEDUPLICATEDYNAMIC

E

EACH ®ELSE ®ELSEIF ®ENABLEENCLOSED ®
ENCRYPTION; added in 5.7.11 (nonreserved)ENDENDSENGINEENGINES
ENUMERRORERRORSESCAPEESCAPED ®
EVENTEVENTSEVERYEXCHANGEEXECUTE
EXISTS ®EXIT ®EXPANSIONEXPIREEXPLAIN ®
EXPORTEXTENDEDEXTENT_SIZE

F

FALSE ®FASTFAULTSFETCH ®FIELDS
FILEFILE_BLOCK_SIZE; added in 5.7.6 (nonreserved)FILTER; added in 5.7.3 (nonreserved)FIRSTFIXED
FLOAT ®FLOAT4 ®FLOAT8 ®FLUSHFOLLOWS; added in 5.7.2 (nonreserved)
FOR ®FORCE ®FOREIGN ®FORMATFOUND
FROM ®FULLFULLTEXT ®FUNCTION

G

GENERALGENERATED ®; added in 5.7.6 (reserved)GEOMETRYGEOMETRYCOLLECTIONGET ®
GET_FORMATGLOBALGRANT ®GRANTSGROUP ®
GROUP_REPLICATION; added in 5.7.6 (nonreserved)

H

HANDLERHASHHAVING ®HELPHIGH_PRIORITY ®
HOSTHOSTSHOURHOUR_MICROSECOND ®HOUR_MINUTE ®
HOUR_SECOND ®

I

IDENTIFIEDIF ®IGNORE ®IGNORE_SERVER_IDSIMPORT
IN ®INDEX ®INDEXESINFILE ®INITIAL_SIZE
INNER ®INOUT ®INSENSITIVE ®INSERT ®INSERT_METHOD
INSTALLINSTANCE; added in 5.7.11 (nonreserved)INT ®INT1 ®INT2 ®
INT3 ®INT4 ®INT8 ®INTEGER ®INTERVAL ®
INTO ®INVOKERIOIO_AFTER_GTIDS ®IO_BEFORE_GTIDS ®
IO_THREADIPCIS ®ISOLATIONISSUER

J

JOIN ®JSON; added in 5.7.8 (nonreserved)

K

KEY ®KEYS ®KEY_BLOCK_SIZEKILL ®

L

LANGUAGELASTLEADING ®LEAVE ®LEAVES
LEFT ®LESSLEVELLIKE ®LIMIT ®
INEAR ®LINES ®LINESTRINGLISTLOAD ®
LOCALLOCALTIME ®LOCALTIMESTAMP ®LOCK ®LOCKS
LOGFILELOGSLONG ®LONGBLOB ®LONGTEXT ®
LOOP ®LOW_PRIORITY ®

M

MASTERMASTER_AUTO_POSITIONMASTER_BIND ®MASTER_CONNECT_RETRYMASTER_DELAY
MASTER_HEARTBEAT_PERIODMASTER_HOSTMASTER_LOG_FILEMASTER_LOG_POSMASTER_PASSWORD
MASTER_PORTMASTER_RETRY_COUNTMASTER_SERVER_IDMASTER_SSLMASTER_SSL_CA
MASTER_SSL_CAPATHMASTER_SSL_CERTMASTER_SSL_CIPHERMASTER_SSL_CRLMASTER_SSL_CRLPATH
MASTER_SSL_KEYMASTER_SSL_VERIFY_SERVER_CERT ®MASTER_TLS_VERSION; added in 5.7.10 (nonreserved)MASTER_USERMATCH ®
MAXVALUE ®MAX_CONNECTIONS_PER_HOURMAX_QUERIES_PER_HOURMAX_ROWSMAX_SIZE
MAX_STATEMENT_TIME; added in 5.7.4 (nonreserved); removed in 5.7.8MAX_UPDATES_PER_HOURMAX_USER_CONNECTIONSMEDIUMMEDIUMBLOB ®
MEDIUMINT ®MEDIUMTEXT ®MEMORYMERGEMESSAGE_TEXT
MICROSECONDMIDDLEINT ®MIGRATEMINUTEMINUTE_MICROSECOND ®
MINUTE_SECOND ®MIN_ROWSMOD ®MODEMODIFIES ®
MODIFYMONTHMULTILINESTRINGMULTIPOINTMULTIPOLYGON
MUTEXMYSQL_ERRNO

N

NAMENAMESNATIONALNATURAL ®NCHAR
NDBNDBCLUSTERNEVER; added in 5.7.4 (nonreserved)NEWNEXT
NONODEGROUPNONBLOCKING; removed in 5.7.6NONENOT ®
NO_WAITNO_WRITE_TO_BINLOG ®NULL ®NUMBERNUMERIC ®
NVARCHAR

O

OFFSETOLD_PASSWORD; removed in 5.7.5ON ®ONEONLY
OPENOPTIMIZE ®OPTIMIZER_COSTS ®; added in 5.7.5 (reserved)OPTION ®OPTIONALLY ®
OPTIONSOR ®ORDER ®OUT ®OUTER ®
OUTFILE ®OWNER

P

PACK_KEYSPAGEPARSERPARSE_GCOL_EXPR; added in 5.7.6 (reserved); became nonreserved in 5.7.8PARTIAL
PARTITION ®PARTITIONINGPARTITIONSPASSWORDPHASE
PLUGINPLUGINSPLUGIN_DIRPOINTPOLYGON
PORTPRECEDES; added in 5.7.2 (nonreserved)PRECISION ®PREPAREPRESERVE
PREVPRIMARY ®PRIVILEGESPROCEDURE ®PROCESSLIST
PROFILEPROFILESPROXYPURGE ®

Q

QUARTERQUERYQUICK

R

RANGE ®READ ®READS ®READ_ONLYREAD_WRITE ®
REAL ®REBUILDRECOVERREDOFILEREDO_BUFFER_SIZE
REDUNDANTREFERENCES ®REGEXP ®RELAYRELAYLOG
RELAY_LOG_FILEELAY_LOG_POSRELAY_THREADRELEASE ®
RELOADREMOVERENAME ®REORGANIZEREPAIR
REPEAT ®REPEATABLEREPLACE ®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)
REPLICATIONREQUIRE ®RESETRESIGNAL ®RESTORE
RESTRICT ®RESUMERETURN ®RETURNED_SQLSTATERETURNS
REVERSEREVOKE ®RIGHT ®RLIKE ®ROLLBACK
ROLLUPROTATE; added in 5.7.11 (nonreserved)ROUTINEROWROWS
ROW_COUNTROW_FORMATRTREE

S

SAVEPOINTSCHEDULESCHEMA ®SCHEMAS ®SCHEMA_NAME
SECONDSECOND_MICROSECOND ®SECURITYSELECT ®SENSITIVE ®
SEPARATOR ®SERIALSERIALIZABLESERVERSESSION
SET ®SHARESHOW ®SHUTDOWNSIGNAL ®
SIGNEDSIMPLESLAVESLOWSMALLINT ®
SNAPSHOTSOCKETSOMESONAMESOUNDS
SOURCESPATIAL ®SPECIFIC ®SQL ®SQLEXCEPTION ®
SQLSTATE ®SQLWARNING ®SQL_AFTER_GTIDSSQL_AFTER_MTS_GAPSSQL_BEFORE_GTIDS
SQL_BIG_RESULT ®SQL_BUFFER_RESULTSQL_CACHESQL_CALC_FOUND_ROWS ®SQL_NO_CACHE
SQL_SMALL_RESULT ®SQL_THREADSQL_TSI_DAYSQL_TSI_HOURSQL_TSI_MINUTE
SQL_TSI_MONTHSQL_TSI_QUARTERSQL_TSI_SECONDSQL_TSI_WEEKSQL_TSI_YEAR
SSL ®STACKEDSTARTSTARTING ®STARTS
STATS_AUTO_RECALCSTATS_PERSISTENTSTATS_SAMPLE_PAGESSTATUSSTOP
STORAGESTORED ®; added in 5.7.6 (reserved)STRAIGHT_JOIN ®STRINGSUBCLASS_ORIGIN
SUBJECTSUBPARTITIONSUBPARTITIONSSUPERSUSPEND
SWAPSSWITCHES

T

TABLE ®TABLESTABLESPACETABLE_CHECKSUMTABLE_NAME
TEMPORARYTEMPTABLETERMINATED ®TEXTTHAN
THEN ®TIMETIMESTAMPTIMESTAMPADDTIMESTAMPDIFF
TINYBLOB ®TINYINT ®TINYTEXT ®TO ®TRAILING ®
TRANSACTIONTRIGGER ®TRIGGERSTRUE ®TRUNCATE
TYPETYPES

U

UNCOMMITTEDUNDEFINEDUNDO ®UNDOFILEUNDO_BUFFER_SIZE
UNICODEUNINSTALLUNION ®UNIQUE ®UNKNOWN
UNLOCK ®UNSIGNED ®UNTILUPDATE ®UPGRADE
USAGE ®USE ®USERUSER_RESOURCESUSE_FRM
USING ®UTC_DATE ®UTC_TIME ®UTC_TIMESTAMP ®

V

VALIDATION; added in 5.7.5 (nonreserved)VALUEVALUES ®VARBINARY ®VARCHAR ®
VARCHARACTER ®VARIABLESVARYING ®VIEWVIRTUAL ®; added in 5.7.6 (reserved)

W

WAITWARNINGSWEEKWEIGHT_STRINGWHEN ®
WHERE ®WHILE ®WITH ®WITHOUT; added in 5.7.5 (nonreserved)WORK
WRAPPERWRITE ®

X

X509XAXID; added in 5.7.5 (nonreserved)XMLXOR ®

Y

YEARYEAR_MONTH ®

Z

ZEROFILL ®

4. 总结

MySQL关键字很多,大部分关键字可以直接用作表名或者字段名,但是保留字必须用引号包含才可以使用。但是还是能不用尽量不用吧,毕竟麻烦,打断sql多一个少一个引号根本注意不到好吗?!!你可以做但没必要~

在达梦数据库中,使用 `INTERVAL` 作为字段名时出现错误的原因主要是 `INTERVAL` 是数据库关键字之一,用于定义时间间隔或自动分区策略。当尝试将其用作字段名时,数据库会将其识别为关键字而非普通标识符,从而导致语法错误或解析冲突。这种现象在其他数据库系统中也较为常见,例如 MySQL 或 Oracle,关键字使用通常受到限制[^1]。 ### 报错原因 1. **关键字冲突**:`INTERVAL` 是达梦数据库中的保留关键字,常用于 `PARTITION BY RANGE` 的自动分区定义中,例如 `INTERVAL(NUMTOYMINTERVAL(1, 'year'))`,用于指定分区的时间间隔[^3]。 2. **对象名解析失败**:数据库解析器在处理 SQL 语句时,会优先将 `INTERVAL` 解析为关键字而非字段名,导致 SQL 语法错误。 ### 解决方法 1. **避免使用关键字作为字段名**:最直接的方法是更改字段名称,避免与数据库关键字冲突。例如,可以将 `interval` 改为 `time_interval` 或 `duration` 等非关键字名称。 2. **使用引号包裹字段名**:如果必须使用 `INTERVAL` 作为字段名,可以在定义字段时使用双引号(`"interval"`)进行包裹,以告知数据库将其视为标识符而非关键字。例如: ```sql CREATE TABLE example_table ( id INT PRIMARY KEY, "interval" VARCHAR(50) ); ``` 该方法适用于字段定义和查询语句中,确保数据库正确解析字段名[^1]。 3. **检查数据库关键字列表**:在设计表结构时,建议查阅达梦数据库的官方文档,了解其关键字列表,避免使用保留关键字作为对象名。 ### 示例代码 以下是一个使用双引号包裹 `INTERVAL` 字段名的建表示例: ```sql CREATE TABLE task_schedule ( task_id INT PRIMARY KEY, task_name VARCHAR(100), "interval" VARCHAR(20) ); ``` 在查询时,也需使用双引号包裹字段名: ```sql SELECT task_id, "interval" FROM task_schedule WHERE task_id = 1; ``` ### 总结 使用 `INTERVAL` 作为字段名时出现错误的根本原因是其为达梦数据库关键字。解决方法包括避免使用关键字使用双引号包裹字段名以及在设计阶段查阅数据库关键字列表以规避冲突。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值