【问题标题】:mySql syntax error behavior?mySql 语法错误行为?
【发布时间】:2013-04-12 16:35:31
【问题描述】:

我正在执行这个查询:

INSERT INTO sent_emails (mailBody,azRatesFilesSendingId,fileName,tarrif_id,destination,cc,bcc,email_content,attached_file) VALUES ('尊敬的先生,

请查看随附的 TELTAC WORLDWIDE 费率通知。
经客户经理批准,即日起生效。
 请确认您的收据至 ra@teltacworldwide.com  此致,
============ =====================费率部Teltac World Wide Inc.Ibisa Bldg, 3rd Floor, Racreet , VerdunP.O.Box: 43 BrTel: +9632 Ext: 114F338Email: ratom================================= ==

' , '33435','Teltac-Rate Sheet-ATel 2013-Apr-19','276','ratcation.com','ratrldwide.com','','查看','打开')

当有人试图执行它时,它给了我一个语法错误:

DBHandler 中的错误---executeUpdateQuery-->com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取正确的语法,以便在 'MsoNormal" style="margin: 0in 0in 0pt;">尊敬的先生,

但是当我在 MySql 服务器中执行它时,语句成功执行并返回一行已生效! 所以我可以看到这不是语法错误,但我无法弄清楚问题所在!

【问题讨论】:

  • 能否请您发布 Java 代码。

标签: mysql jakarta-ee syntax-error tomcat6


【解决方案1】:

我使用了 apache .jar 中的 StringEscapeUtils,它就像一个魅力!我读到它不安全,因为它可能会带来 SQL 注入问题,但是由于此应用程序仅在内部使用,因此我认为它是安全的!

【讨论】:

    【解决方案2】:

    这似乎是String 连接和查询构建的问题。如果没有实际代码,这只是一个猜测,但它是有根据的。

    当使用String contentation 将任意Strings 插入数据库时​​,这是一个非常常见的问题。例如

    final String query = "SELECT * FROM my_table WHERE value = '" + value + "'";
    

    上面的查询看起来不错,它做了它应该做的事情。但是如果value 出乎意料呢?

    final String value = "damn, it's got an apostrophe";
    

    现在突然你有一个错误的查询。更糟糕的是,如果我们有

    final String value = "something'; DROP DATABASE myDatabase --";
    

    那么我们遇到了一个真正的问题。

    您应该使用PreparedStatement 来执行查询,否则您可能会遇到各种奇怪的问题,通常称为 SQL 注入。

    这是一个使用您的查询和SET 语法的示例,它在PreparedStatements 中更清晰。

    final String query = "INSERT INTO sent_emails SET"
            + "mailBody = ?,"
            + "azRatesFilesSendingId = ?,"
            + "fileName = ?,"
            + "tarrif_id = ?,"
            + "destination = ?,"
            + "cc = ?,"
            + "bcc = ?,"
            + "email_content = ?,"
            + "attached_file = ?";
    final PreparedStatement preparedStatement = conn.prepareStatement(query);
    preparedStatement.setString(1, mailBody);
    preparedStatement.setInt(2, azRatesFilesSendingId);
    //and the rest of the parameters.
    

    【讨论】:

    • 我同意上述观点,但是当我在 MySql 查询生成器中直接对 mySql 执行此查询时,一切正常,但是当它在生产环境中执行时,它给了我这个错误,但它插入sent_emails 表中的查询!这是一种奇怪的行为!
    • 您确定您在某处没有未转义的分号并且您自己没有进行 sql 注入吗?是否插入了整个数据?
    【解决方案3】:

    问题在于格式。

    您的邮件正文中可能有带有样式信息的 HTML 代码,其中还包含“'”。

    在将文本插入数据库之前,您应该确保转义所有单括号和双括号。

    【讨论】:

      猜你喜欢
      • 2017-12-16
      • 1970-01-01
      • 2010-12-04
      • 2011-07-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多