MySQL的第一个值被解释为columnname

时间:2013-01-09 11:15:19

标签: java sql jdbc

使用JDBC,我试图执行以下SQL语句:

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

但是这会返回errormessage

  

未知栏' SomeString'在'字段列表'

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

已经检查了表结构,也许我只是通过这个结构,但我似乎无法找到导致此问题的原因。

5 个答案:

答案 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表示要插入标题列的文本值,文本应始终用单引号括起来。