MySQL的第一个值被解释为columnname

dee*_*mel -1 java sql jdbc

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

INSERT INTO meta (title, hlcount, textcount, imgcount, linkcount) VALUES (SomeString,6,4794,1,76)
Run Code Online (Sandbox Code Playgroud)

但这会返回错误消息

'字段列表'中的未知列'SomeString'

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

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

Jon*_*eet 5

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

因为你已经得到它SomeString,而不是像文本那样'SomeString'.这就是SQL的工作方式 - 这也是正常代码的工作原理.如果你有:

String foo = bar;
Run Code Online (Sandbox Code Playgroud)

你会期望试图复制一个被调用的变量的值bar,不是吗?如果你的意思是一个由三个字符组成的字符串,b,a,r,你可以使用:

String foo = "bar";
Run Code Online (Sandbox Code Playgroud)

它在SQL中也是一样的.

但是,假设这个SQL是从实际值构建的,那么你应该使用PreparedStatementwith参数:

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
Run Code Online (Sandbox Code Playgroud)

这样你就可以避免SQL注入攻击和字符串转换问题(例如日期).它还使您的SQL更清洁,将代码与数据分开.