从Java内部执行查询以创建函数

时间:2012-01-26 16:03:13

标签: java mysql

以下代码在MySQL客户端内部运行,或通过管道传输到mysql。当我尝试在Java中作为查询运行它时 我收到错误

  

执行SQL语句时出错   com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您的SQL语法中有错误;检查与您的MySQL服务器版本对应的手册,以便在#" delimiter @'

附近使用正确的语法

这是我遇到的第一个问题。我尝试用空格替换换行符,将其作为一行语句运行,除了Java之外,它在任何地方都可以使用。尝试没有DROP语句,同样的问题。

  

错误代码1064(解析错误),状态42000

感谢您提供的任何帮助。


DROP FUNCTION IF EXISTS escape_query_result;

delimiter @

CREATE FUNCTION escape_query_result(label CHAR(255))
    RETURNS CHAR(255)
BEGIN
    RETURN (REPLACE(REPLACE(REPLACE(label, "\\", "\\\\"), "|", "\\|"), "=", "\\="));
END@

delimiter ;

由于我无法发布答案,因此请修改我的问题:

找到我的答案。

http://bugs.mysql.com/bug.php?id=25019

您无法从查询中更改分隔符。在没有分隔符调用的情况下执行。

1 个答案:

答案 0 :(得分:0)

我的猜测是,在你的MySQL连接字符串中,你需要将allowMultiQueries设置为true;否则,向MySQL发送一个将多个语句与分号组合在一起的查询是错误的。请参阅此处的文档:

http://dev.mysql.com/doc/refman/5.0/en/connector-j-reference-configuration-properties.html

allowMultiQueries的默认设置为false。

但是,出于安全原因,将其设置为false实际上很有用,因为大多数SQL注入攻击都是通过在查询中注入分号来实现的。如果allowMultiQueries为false,则这些注入将导致错误,而不是删除其中一个表中的所有行。在这种情况下,最好将DROP作为单独的查询发送。

然而,我不确定它是如何与MySQL中的DELIMITER命令交互的。也许其他人可以帮助你,因为我现在没时间测试它。