【问题标题】:SQL & Java Error with using SQL characters使用 SQL 字符时出现 SQL 和 Java 错误
【发布时间】:2015-02-26 23:47:12
【问题描述】:

我遇到了一个似乎无法解决的 SQL 问题。问题是当使用 sql 语句本身使用的特殊字符时,它根本不喜欢它。我尝试了很多方法,但找不到答案。

错误是由于在放入 SQL 表的文本中使用了 ' 字符。

NobleCore.getSQLStaticly().updateSQL("INSERT INTO Punishment (`ID`, `UUID`, `PlayerName`, `StaffName`, `Sev`, `pType`, `Reason`, `Activated`, `Ends`, `Active`, `RemoveReason`, `RemovedBy`) VALUES (NULL, '" + playerUUID + "', '" + player + "', '" + staffName + "' , '" + severity + "', '" + pType +"', '" + reason + "', CURRENT_TIMESTAMP,'" + end + "', '1', NULL, NULL );");

正如你所看到的,当它从方法参数中添加 '" + reason + "' 字符串时,它会出错,导致语法异常,因为它包含 ' 字符。我怎样才能让它添加这个字符,以便它知道它是字符串的一部分,而不是在语句中使用。

[17:28:29] [Server thread/WARN]: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ']', CURRENT_TIMESTAMP,'2015-02-26 17:58:29.708', '1', NULL, NULL )' at line 1

如果您需要任何其他代码,请告诉我,但我不知道它会有什么帮助:P

【问题讨论】:

  • 您应该在保存之前对 java 中的数据进行清理/转义。
  • 变量reason的值是多少?

标签: java mysql sql syntax


【解决方案1】:

您的变量reason 中似乎有一个字符导致您的SQL 无效。改为使用准备好的语句来保存值。 BTW NULL 值可以从查询中省略

【讨论】:

    【解决方案2】:

    在这种情况下,通常的做法是使用PreparedStatement,而不是从头开始动态构建语句。

    PreparedStatement 中,您将问号放在值的位置,然后使用各种setXXX 方法将值填满。例如,setString() 方法会针对相关数据库适当地转义给定值中的引号(也就是说,根据 JDBC 驱动程序,可能有不同的转义引号的方法,而 JDBC 会自动为您执行此操作)。

    如果您坚持自己构建查询,在 SQL 中转义引号的标准方法是将它们加倍。例如,如果您的值为Sean O'Connor,则相应的引用值为Sean O''Connor。编写一个方法很容易将字符串中的每个单引号加倍。

    但同样,我建议为此信任 JDBC 驱动程序的作者并使用PreparedStatement

    【讨论】:

    • 好的,谢谢。非常干净的解释!我会考虑改用准备好的语句。
    猜你喜欢
    • 1970-01-01
    • 2013-07-17
    • 1970-01-01
    • 2017-05-01
    • 2012-10-06
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多