- 论坛徽章:
- 0
|
转载:
字段名为mysql保留字的表的插入问题
今天在用mysql的时候遇到一个保留字的问题,自己总结下,呵呵。
问题环境:
mysql 版本 5.0.41-log
elipse 版本 3.3.0
hibernate 版本 3.0
数据库表名user
+------+---------+------------+-------------+
| userid | username | password | ssl |
+------+---------+------------+-------------+
问题现象:
执行代码
java 代码
session.save(user) //user为user数据表的映射对象
发生异常。
异常信息:
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
问题原因:
通过查找相关资料,发现ssl为mysql的保留字,不能像普通字段那样进行数据库操作。
问题解决方法:
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数据类型或函数名作为表名或列名,例如TIMESTAMP或GROUP,会造成一个常见问题。允许你这样操作(例如,ABS可以作为一个列名)。但是,默认情况下,在数调用中在函数名和后面的‘(’字符之间不允许有空格。该要求使函数调用与列名引用不同。
该行为的不利结果是在某些上下文中省略一个空格会使识别符解释为函数名。例如,该语句合法:
mysql> CREATE TABLE abs (val INT);但省略abs后面的空格会造成语法错误,因为省略后该语句好像要调用ABS()函数:
mysql> CREATE TABLE abs(val INT);如果SQL服务器模式包括IGNORE_SPACE模式值,服务器允许函数调用时在函数名和后面的‘(’字符之间有空格。这样使函数名被视为保留字。结果是,与函数名相同的识别符必须按照
[color="#800080"]9.2节,“数据库、表、索引、列和别名”
中所描述的引起来。SQL服务器模式按照
[color="#0000ff"]5.3.2节,“SQL服务器模式”
中所描述的进行控制。
限定名中句点后面的字必须为一个识别符,因此不需要将它引起来,即使它是一个保留字。
在MySQL中,下表中的字显式被保留。其中大多数字进制被标准SQL用作列名和/或表名(例如,GROUP)。少数被保留了,因为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 |
|