- 論壇徽章:
- 0
|
轉載:
字段名為mysql保留字的表的插入問題
今天在用mysql的時候遇到一個保留字的問題,自己總結下,呵呵。
問題環(huán)境:
mysql 版本 5.0.41-log
elipse 版本 3.3.0
hibernate 版本 3.0
數(shù)據(jù)庫表名user
+------+---------+------------+-------------+
| userid | username | password | ssl |
+------+---------+------------+-------------+
問題現(xiàn)象:
執(zhí)行代碼
java 代碼
session.save(user) //user為user數(shù)據(jù)表的映射對象
發(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
問題原因:
通過查找相關資料,發(fā)現(xiàn)ssl為mysql的保留字,不能像普通字段那樣進行數(shù)據(jù)庫操作。
問題解決方法:
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表對應的映射文件User.hbm.xml中的ssl的信息改為
xml 代碼
property name="ssl" column="`SSL`" type="java.lang.Long" not-null="false" length="1" />
注意:ssl旁邊的不是單引號" ' "而是" ` ",鍵盤最左上角的那個,呵呵!
附:mysql保留字表和相關信息(轉載)
嘗試使用一個識別符,例如使用嵌入式MySQL數(shù)據(jù)類型或函數(shù)名作為表名或列名,例如TIMESTAMP或GROUP,會造成一個常見問題。允許你這樣操作(例如,ABS可以作為一個列名)。但是,默認情況下,在數(shù)調用中在函數(shù)名和后面的‘(’字符之間不允許有空格。該要求使函數(shù)調用與列名引用不同。
該行為的不利結果是在某些上下文中省略一個空格會使識別符解釋為函數(shù)名。例如,該語句合法:
mysql> CREATE TABLE abs (val INT);但省略abs后面的空格會造成語法錯誤,因為省略后該語句好像要調用ABS()函數(shù):
mysql> CREATE TABLE abs(val INT);如果SQL服務器模式包括IGNORE_SPACE模式值,服務器允許函數(shù)調用時在函數(shù)名和后面的‘(’字符之間有空格。這樣使函數(shù)名被視為保留字。結果是,與函數(shù)名相同的識別符必須按照
[color="#800080"]9.2節(jié),“數(shù)據(jù)庫、表、索引、列和別名”
中所描述的引起來。SQL服務器模式按照
[color="#0000ff"]5.3.2節(jié),“SQL服務器模式”
中所描述的進行控制。
限定名中句點后面的字必須為一個識別符,因此不需要將它引起來,即使它是一個保留字。
在MySQL中,下表中的字顯式被保留。其中大多數(shù)字進制被標準SQL用作列名和/或表名(例如,GROUP)。少數(shù)被保留了,因為MySQL需要它們,(目前)使用yacc解析程序。保留字被引起來后可以用作識別符
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
本文來自ChinaUnix博客,如果查看原文請點:http://blog.chinaunix.net/u/10295/showart_1736281.html |
|