我的预生产任务是创建工具来解析MySQL数据库模式并生成脚本以完全或部分地重新创建它。我已经通过从INFORMATION_SCHEMA表中获取元数据并将其以树状结构的形式存储在内存中来实现任务的第一部分。现在我正忙着为每个数据库对象生成脚本。我遇到的问题是在编写字符串文字时转义特殊字符转义序列(如this页,表9.1中所述),例如'
和"
。文字可以在触发器和例程主体中或在视图定义的SELECT
部分中得到满足。
当我生成用于创建,例如,触发器的脚本时,带有未转义引号的文字会破坏查询,如果没有手动更正,我无法运行它。我得到这样的东西。
我希望能够在生成后立即运行我的查询,因此我需要使用转义引号来编写它们。我提出了两种可能的解决方案。
QUOTE()
不是这种情况,因为它会在例程/触发器定义中逃避每个可以逃避的字符,甚至是那些不应该被转义的字符。在脚本生成之前手动转义该序列。我试图找出正则表达式来找到和替换这些单位,这就是我得到的。
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());`
当然,如果你在我的例子中有几个文字,这将不起作用。它将逃脱第一个和最后一个单引号字符之间的所有单引号,并将两个或多个文字转换为一个无意义的字符串。我猜测是否有可能在应用程序端执行此操作,因为正则表达式无法知道文字的起点和终点。只有我和MySQL可以。
我已经尝试过来自here的Walid正则表达式解决方案,它会转义我的字符串中的所有目标字符,甚至是文字的起始和结束引号。
我非常感谢您在应用程序或MySQL方面做任何建议。