2013-01-09 30 views
-1

使用JDBC,我试图执行下面的SQL语句:MySQL的第一个值解释为COLUMNNAME

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

但这返回errormessage的

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

所以它看起来第一个值被解释为一列,那是怎么回事?

已经检查过表结构,也许我只是在这一个上隧道,但我似乎无法找到造成这个问题的原因。

+0

尝试使用“SomeString”而不是SomeString。 –

+0

尝试'someString'而不是 – justMe

+0

您是否向您的字符串添加了引号? – duffy356

回答

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

2

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

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

将引号放在SomeString的周围。

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

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

1

当过要插入日期或字符串值,你有

附上

是“”(单引号)总是用这个]

或““(反勾字符)并不总是]

INSERT INTO元(标题,hlcount,textcount,imgcount,linkcount)VALUES( 'SomeString',6,4794,1,76)

INSERT IN TO meta(title,hlcount,textcount,imgcount,linkcount)VALUES(“SomeString”,6,4794,1,76)

1

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

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

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