使用 JDBC,我正在尝试执行以下 SQL 语句:
INSERT INTO meta (title, hlcount, textcount, imgcount, linkcount) VALUES (SomeString,6,4794,1,76)
但这会返回错误消息
“字段列表”中的未知列“SomeString”
所以似乎第一个值被解释为一列,那是怎么回事?
已经检查过表结构,也许我只是在这个上挖了隧道,但我似乎找不到这个问题的原因。
所以似乎第一个值被解释为一列,那是怎么回事?
因为您将其作为SomeString
,而不是文本值,例如'SomeString'
. 这就是 SQL 的工作方式——这也是普通代码的工作方式,真的。如果你有:
String foo = bar;
你会期望它试图复制一个名为 的变量的值bar
,不是吗?如果你的意思是三个字符的字符串,b、a、r,你会使用:
String foo = "bar";
在 SQL 中也是如此。
PreparedStatement
但是,假设此 SQL 是根据实际值构建的,则无论如何您都应该使用with 参数:
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 更清晰,将代码与数据分开。
字符串应该在单引号('')内。
INSERT INTO meta (title, hlcount, textcount, imgcount, linkcount) VALUES ('SomeString',6,4794,1,76)
在 SomeString 周围加上引号。
INSERT INTO meta
(title, hlcount, textcount, imgcount, linkcount)
VALUES ('SomeString',6,4794,1,76)
这将强制引擎将其视为字符串文字。否则,它将假定它是可以通过列名解决的。
当您插入日期或字符串值时,您必须将其括起来
要么''(单引号)[总是使用这个]
或“”(反引号字符)[并非总是]
插入元数据(标题、hlcount、textcount、imgcount、linkcount)值('SomeString',6,4794,1,76)
或者
插入元(标题,hlcount,textcount,imgcount,linkcount)值(“SomeString”,6,4794,1,76)
你应该使用单引号'Somestring'。
INSERT INTO meta (title, hlcount, textcount, imgcount, linkcount) VALUES ('SomeString',6,4794,1,76)
因为 SomeString 表示要插入到标题列中的文本值,并且文本应始终用单引号引起来。