Java SQL语法错误异常

Java SQL语法错误异常,java,mysql,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.MySQLSyntaxErr

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

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()
的结果


我不熟悉使用数据库,我确信是一个简单的语法错误导致了这种情况。

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

重写如下:

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

显然,在将数据放入数据库之前,您必须对其进行转义。

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

重写如下:

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

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

这样可以避免此类问题,如果使用预先准备好的语句,则可以编写更安全的代码

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();

如果使用预先准备好的语句,您将避免此类问题,并编写更安全的代码

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();

用双引号将任何字符串值括起来。你也需要逃离他们

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

强制性不要忘记清理单引号注释的输入。用双引号将任何字符串值括起来。你也需要逃离他们

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

强制性不要忘记清理单引号注释的输入。

通过查看构建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, ...);
当您查看SQL时,应该能够更容易地看到您的
fooURL
周围没有引号。因此,它被解释为一个表达式,而不是一个简单的标量字符串值。一个单词的表达式只是假定为列名,但ad表中不存在该名称的列

最好避免在SQL语句中插入字符串


您不需要引用或转义查询参数。使用参数要比记住平衡引号的位置容易得多。出于这个原因,它也更安全,因为您更有可能正确地执行它。

通过查看构建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, ...);
当您查看SQL时,应该能够更容易地看到您的
fooURL
周围没有引号。因此,它被解释为一个表达式,而不是一个简单的标量字符串值。一个单词的表达式只是假定为列名,但ad表中不存在该名称的列

最好避免在SQL语句中插入字符串

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