MySQL SQL Error: 1064, SQLState: 42000 错误
                        原创
                        
                        mysql
                    
                在 MySQL 中,下表中的字显式被保留。其中大多数字进制被标准 SQL 用作列名 和/或 表名( 例如,GROUP) 。少数被保留了,因为 MySQL 需要它们,( 目前) 使用 yacc 解析程序。保留字被引起来后可以用作识别符。
你不小心使用了下面的关键字,那么就会报这个错误:
SQL Error: 1064, SQLState: 42000
MySQL 关键字和保留字
下面这个表格的目前 MySQL 所拥有的关键字和保留字,在使用 MySQL 创建库名、表名、字段名等的时候,最好避免直接使用这些单词,并且不分大小写,否则的话很容易报错。
| 1 | 2 | 3 | 
|---|---|---|
| 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 | 
解决方法
有时候由于特殊原因,又必须使用这些关键字当作名称怎么办?办法还是有的,这里推荐三种方式来解决这个问题。
一、将表名或字段名用方括号([])括起来
xml 配置:
<property name="desc" type="string">
    <column name="[DESC]" length="255" not-null="true"/>
</property>
注解:
@Column(name = "[DESC]", nullable = false)
public String getDesc() {
    return this.desc;
}
二、将表名或字段名用两个重音符号(`)括起来
重音符号键即是键盘上 “1” 键左边的、“Tab” 键上边的那个键。此符号亦被称为“反向引号”。
xml 配置:
<property name="desc" type="string">
    <column name="`DESC`" length="255" not-null="true"/>
</property>
注解:
@Column(name = "`DESC`", nullable = false)
public String getDesc() {
    return this.desc;
}
三、将表名或字段名用双引号(")括起来
xml 配置:
<property name="desc" type="string">
    <column name='"DESC"' length="255" not-null="true"/>
</property>
注解:
@Column(name = "\"DESC\"", nullable = false)
public String getDesc() {
    return this.desc;
}
