使用JDBC,我试图执行以下SQL语句:
INSERT INTO meta (title, hlcount, textcount, imgcount, linkcount) VALUES (SomeString,6,4794,1,76)
但是这会返回errormessage
未知栏' SomeString'在'字段列表'
所以似乎第一个值被解释为一个列,那是怎么回事?
已经检查了表结构,也许我只是通过这个结构,但我似乎无法找到导致此问题的原因。
答案 0 :(得分:5)
所以似乎第一个值被解释为一个列,那是怎么回事?
因为您只是SomeString
,而不是文本值,例如'SomeString'
。这就是SQL的工作方式 - 这也是正常代码的工作原理。如果你有:
String foo = bar;
您希望尝试复制名为bar
的变量的值,不是吗?如果你的意思是三个字符的字符串,b,a,r,你可以使用:
String foo = "bar";
在SQL中也是如此。
但是,假设这个SQL是从实际值构建的,那么你应该使用带有参数的PreparedStatement
:
String sql = "INSERT INTO meta (title, hlcount, textcount, imgcount, linkcount)"
+ " VALUES (?, ?, ?, ?, ?)";
PreparedStatement pst = conn.prepareStatement(sql);
pst.setString(1, "SomeString");
pst.setInt(2, 6);
// etc
这样您就可以避免SQL注入攻击和字符串转换问题(例如日期)。它还使您的SQL更清晰,将代码与数据分开。
答案 1 :(得分:2)
字符串应在单引号('')内。
INSERT INTO meta (title, hlcount, textcount, imgcount, linkcount) VALUES ('SomeString',6,4794,1,76)
答案 2 :(得分:1)
在SomeString周围加上引号。
INSERT INTO meta
(title, hlcount, textcount, imgcount, linkcount)
VALUES ('SomeString',6,4794,1,76)
这会强制引擎将其视为字符串文字。否则,它会假设它可以通过列名解析。
答案 3 :(得分:1)
当您插入日期或字符串值时,必须用
括起来要么''(单引号)[总是使用这个]
或“”(后退字符)[并不总是]
INSERT INTO meta(title,hlcount,textcount,imgcount,linkcount)VALUES('SomeString',6,4794,1,76)
或
INSERT INTO meta(title,hlcount,textcount,imgcount,linkcount)VALUES(“SomeString”,6,4794,1,76)
答案 4 :(得分:1)
你应该使用单引号'Somestring'。
INSERT INTO meta (title, hlcount, textcount, imgcount, linkcount) VALUES ('SomeString',6,4794,1,76)
因为SomeString表示要插入标题列的文本值,文本应始终用单引号括起来。