[總結(jié)]字段名為mysql保留字的表的插入問(wèn)題博客分類(lèi):
javaMySQLSQLSQL Server嵌入式Hibernate今天在用mysql的時(shí)候遇到一個(gè)保留字的問(wèn)題,自己總結(jié)下,呵呵。
問(wèn)題環(huán)境:
mysql 版本 5.0.41-log
eclipse 版本 3.3.0
hibernate 版本 3.0
數(shù)據(jù)庫(kù)表名user
+------+---------+------------+-------------+
| userid | username | password | ssl |
+------+---------+------------+-------------+
問(wèn)題現(xiàn)象:
執(zhí)行代碼
java 代碼
session.save(user) //user為user數(shù)據(jù)表的映射對(duì)象
發(fā)生異常。
異常信息:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ssl) values(4, '3', '3', 2)' at line 1
問(wèn)題原因:
通過(guò)查找相關(guān)資料,發(fā)現(xiàn)ssl為mysql的保留字,不能像普通字段那樣進(jìn)行數(shù)據(jù)庫(kù)操作。
問(wèn)題解決方法:
1. 將java 代碼
session.save(user);
改為
java 代碼
session.createSQLQuery("insert into user(userid, username, password, `ssl`) values(" + user.getUserid() +", "+ user.getUsername +", "+ user.getPassword +", " + user.getSsl() + ")");
query.executeUpdate();
2.將user表對(duì)應(yīng)的映射文件User.hbm.xml中的ssl的信息改為
xml 代碼
<property name="ssl" column="`SSL`" type="java.lang.Long" not-null="false" length="1" />
注意:ssl旁邊的不是單引號(hào)" ' "而是" ` ",鍵盤(pán)最左上角的那個(gè),呵呵!
附:mysql保留字表和相關(guān)信息(轉(zhuǎn)載)
嘗試使用一個(gè)識(shí)別符,例如使用嵌入式MySQL數(shù)據(jù)類(lèi)型或函數(shù)名作為表名或列名,例如TIMESTAMP或GROUP,會(huì)造成一個(gè)常見(jiàn)問(wèn)題。允許你這樣操作(例如,ABS可以作為一個(gè)列名)。但是,默認(rèn)情況下,在數(shù)調(diào)用中在函數(shù)名和后面的‘(’字符之間不允許有空格。該要求使函數(shù)調(diào)用與列名引用不同。
該行為的不利結(jié)果是在某些上下文中省略一個(gè)空格會(huì)使識(shí)別符解釋為函數(shù)名。例如,該語(yǔ)句合法:
mysql> CREATE TABLE abs (val INT);但省略abs后面的空格會(huì)造成語(yǔ)法錯(cuò)誤,因?yàn)槭÷院笤撜Z(yǔ)句好像要調(diào)用ABS()函數(shù):
mysql> CREATE TABLE abs(val INT);如果SQL服務(wù)器模式包括IGNORE_SPACE模式值,服務(wù)器允許函數(shù)調(diào)用時(shí)在函數(shù)名和后面的‘(’字符之間有空格。這樣使函數(shù)名被視為保留字。結(jié)果是,與函數(shù)名相同的識(shí)別符必須按照
9.2節(jié),“數(shù)據(jù)庫(kù)、表、索引、列和別名”中所描述的引起來(lái)。SQL服務(wù)器模式按照
5.3.2節(jié),“SQL服務(wù)器模式”中所描述的進(jìn)行控制。
限定名中句點(diǎn)后面的字必須為一個(gè)識(shí)別符,因此不需要將它引起來(lái),即使它是一個(gè)保留字。
在MySQL中,下表中的字顯式被保留。其中大多數(shù)字進(jìn)制被標(biāo)準(zhǔn)SQL用作列名和/或表名(例如,GROUP)。少數(shù)被保留了,因?yàn)镸ySQL需要它們,(目前)使用yacc解析程序。保留字被引起來(lái)后可以用作識(shí)別符
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允許部分關(guān)鍵字用做未引起來(lái)的識(shí)別符,因?yàn)樵S多人以前曾使用過(guò)它們。下面列出了一些例子:
ACTION
BIT
DATE
ENUM
NO
TEXT
TIME
TIMESTAMP