Java 在脚本生成过程中,我可以转义MySQL字符串文本中的转义序列吗?

Java 在脚本生成过程中,我可以转义MySQL字符串文本中的转义序列吗?,java,mysql,regex,escaping,Java,Mysql,Regex,Escaping,我的预生产任务是创建工具来解析MySQL数据库模式,并生成脚本来完全或部分地重新创建它。我实现了任务的第一部分,从信息模式表中获取元数据,并将其以树状结构的形式存储在内存中。现在我正忙于为每个数据库对象生成脚本。我遇到的问题是在编写字符串文本时转义特殊字符转义序列(如第页表9.1中所述),例如“和”。可以在触发器和例程正文中或在视图定义的部分中遇到文本 当我生成用于创建(比如)触发器的脚本时,带有未替换引号的文本会破坏查询,如果没有手动更正,我将无法运行它 我希望能够在生成查询后立即运行我的查

我的预生产任务是创建工具来解析MySQL数据库模式,并生成脚本来完全或部分地重新创建它。我实现了任务的第一部分,从信息模式表中获取元数据,并将其以树状结构的形式存储在内存中。现在我正忙于为每个数据库对象生成脚本。我遇到的问题是在编写字符串文本时转义特殊字符转义序列(如第页表9.1中所述),例如
。可以在触发器和例程正文中或在视图定义的
部分中遇到文本

当我生成用于创建(比如)触发器的脚本时,带有未替换引号的文本会破坏查询,如果没有手动更正,我将无法运行它

我希望能够在生成查询后立即运行我的查询,所以我需要用转义引号编写它们

  • 获取触发器、例程和视图的元数据,就像MySQL以文本形式转义特殊序列一样。我浏览SO和文档已经有一段时间了,但还没有在MySQL端找到合适的函数。(
    QUOTE()
    并非如此,因为它将转义例程/触发器定义中的每个可转义字符,甚至是不应转义的字符)
  • 在脚本生成之前手动转义该序列。我试图找出regexp来查找和替换这些单元,下面是我得到的结果

    Pattern pattern = Pattern.compile("\'(.+)\'");
    Matcher matcher = pattern.matcher("IF (NEW.AccountBalance <> 0 OR NEW.BlockedAmount <> 0) THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='The account can't be closed!' END IF;");
    StringBuilder sb = new StringBuilder();
    while (matcher.find()) {
        sb.append("'").append(matcher.group(1).replace("'", "\\\'")).append("'");
    }
    System.out.println(sb.toString());`
    
    Pattern=Pattern.compile(“\'(.+)\'”);
    Matcher Matcher=pattern.Matcher(“如果(NEW.AccountBalance 0或NEW.BlockedAmount 0),则向SQLSTATE'45000'发送信号,设置消息\u TEXT='帐户无法关闭!'END IF;'”;
    StringBuilder sb=新的StringBuilder();
    while(matcher.find()){
    sb.append(“”).append(matcher.group(1).替换(“”,“\\\”)).append(“”);
    }
    System.out.println(sb.toString())`
    
  • 当然,如果你像我的例子中那样有几个文本,这将不起作用。它将转义第一个和最后一个单引号字符之间的所有单引号,并将两个或多个文本转换为一个无意义的字符串。我猜这是完全有可能在应用程序端执行的,因为正则表达式不知道文本的开始和结束位置。只有我MySQL也可以

    我尝试了Walid的regexp解决方案,它对字符串中的所有目标字符进行了转义,甚至对文字的起始引号和结束引号都进行了转义

    我非常感谢任何关于如何在应用程序或MySQL端执行此操作的建议。

    这是一个非常复杂的问题,可能需要简化,但它看起来像是标准答案“使用参数化查询”的一个例子。你说的特殊字符是什么意思?特殊到什么?我的错。意思是“特殊字符转义序列”“如本文所述: