SQL语法错误异常

时间:2013-03-11 21:34:46

标签: java mysql

我正在尝试执行以下语句:

String sql = "INSERT INTO `ad`.`ad` (`imgURL`, `linkURL`, `client`, `idx`) VALUES (" + a.getImgURL() + " , " + a.getLinkURL() + " , " + a.getClient() + " , " + a.getIdx() + ");";

但是我收到了一个错误:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'fooUrl' in 'field list'

fooUrl是其中一个值 - 它是调用a.getImgUrl()的结果。

我刚接触数据库,我确信一个简单的语法错误导致了这个问题。

4 个答案:

答案 0 :(得分:3)

您将避免这些问题,如果您使用准备好的声明,您将编写更安全的代码。

String sql = "INSERT INTO `ad`.`ad` (`imgURL`, `linkURL`, `client`, `idx`) VALUES (?, ?, ?, ?)";
final PreparedStatement statement = conn.prepareStatement(sql);
statement.setString(1, a.getImgURL()) ;
statement.setString(2, a.getLinkURL()) ;
statement.setString(3, a.getClient()) ;
statement.setString(4, a.getIdx());
final ResultSet results = statement.executeQuery();

答案 1 :(得分:2)

您的数据缺少引号。你写它的方式,你指的是列名。

像这样改写:

String sql = "INSERT INTO `ad`.`ad` (`imgURL`, `linkURL`, `client`, `idx`) 
        VALUES ('" + a.getImgURL() + "' , '" + a.getLinkURL() + "' , '" +
                a.getClient() + "' , '" + a.getIdx() + "');";

显然,在将数据放入数据库之前,您必须先将数据转义。

答案 2 :(得分:0)

用双引号括起任何字符串值。你也需要逃避它们。

String sql = "INSERT INTO `ad`.`ad` (`imgURL`, `linkURL`, `client`, `idx`) VALUES (\"" + a.getImgURL() + "\" , "\" + a.getLinkURL() + \"" , \"" + a.getClient() + "\" , " + a.getIdx() + ");";  

强制性请勿忘记清理单引号备注的输入。

答案 3 :(得分:0)

通过查看构建SQL的代码来尝试调试SQL很困难。

String sql = "INSERT INTO `ad`.`ad` (`imgURL`, `linkURL`, `client`, `idx`) VALUES ("
  + a.getImgURL() + " , " + a.getLinkURL() + " , " + a.getClient() + " , " 
  + a.getIdx() + ");";

而是检查生成的sql字符串:

INSERT INTO `ad`.`ad` (`imgURL`, `linkURL`, `client`, `idx`) VALUES (fooURL, ...);

当您查看fooURL没有引号的SQL时,您应该能够更轻松地查看。因此,它被解释为表达式,而不是简单的标量字符串值。单个单词的表达式只是假定为列名,但广告表中该名称不存在此类列。

避免将字符串插入SQL语句会好得多。 Learn how to use prepared queries and query parameters instead.

String sql = "INSERT INTO `ad`.`ad` (`imgURL`, `linkURL`, `client`, `idx`) "
  + " VALUES (?, ?, ?, ?)";
PreparedStatement insertAd = con.prepareStatement(sql);
insertAd.setString(1, a.getImgUrl);
insertAd.setString(2, a.getLinkUrl);
insertAd.setInt(3, a.getClient);
insertAd.setInt(4, a.getIdx);
insertAd.executeUpdate();

您不需要引用或转义查询参数。使用参数比记住平衡引号的位置要容易得多。因此,它也更安全,因为你更有可能做得对。