-1

使用 JDBC,我正在尝试执行以下 SQL 语句:

INSERT INTO meta (title, hlcount, textcount, imgcount, linkcount) VALUES (SomeString,6,4794,1,76)

但这会返回错误消息

“字段列表”中的未知列“SomeString”

所以似乎第一个值被解释为一列,那是怎么回事?

已经检查过表结构,也许我只是在这个上挖了隧道,但我似乎找不到这个问题的原因。

4

5 回答 5

5

所以似乎第一个值被解释为一列,那是怎么回事?

因为您将其作为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 更清晰,将代码与数据分开。

于 2013-01-09T11:16:43.160 回答
2

字符串应该在单引号('')内。

INSERT INTO meta (title, hlcount, textcount, imgcount, linkcount) VALUES ('SomeString',6,4794,1,76)
于 2013-01-09T11:16:18.943 回答
1

在 SomeString 周围加上引号。

INSERT INTO meta 
  (title, hlcount, textcount, imgcount, linkcount) 
VALUES ('SomeString',6,4794,1,76)

这将强制引擎将其视为字符串文字。否则,它将假定它是可以通过列名解决的。

于 2013-01-09T11:17:12.817 回答
1

当您插入日期或字符串值时,您必须将其括起来

要么''(单引号)[总是使用这个]

或“”(反引号字符)[并非总是]

插入元数据(标题、hlcount、textcount、imgcount、linkcount)值('SomeString',6,4794,1,76)

或者

插入元(标题,hlcount,textcount,imgcount,linkcount)值(“SomeString”,6,4794,1,76)

于 2013-01-09T11:26:04.623 回答
1

你应该使用单引号'Somestring'。

 INSERT INTO meta (title, hlcount, textcount, imgcount, linkcount) VALUES  ('SomeString',6,4794,1,76)  

因为 SomeString 表示要插入到标题列中的文本值,并且文本应始终用单引号引起来。

于 2013-01-09T12:15:21.210 回答