mysql - 转换器 Perl 脚本修复
问题描述
我正在尝试使用一个小的 Perl 脚本来将 SQL INSERT 语句从 MySQL 语法转换为 SQLite 语法。但是该脚本有一个错误,在某些极端情况下无法正确转换字符串常量。
这是脚本:
#!/usr/bin/perl
while (<>){
s/\\'/''/g; # Use '' instead of \'
s/\\"/"/g; # Use " instead of \"
s/\\r\\n/\r\n/g; # Convert escaped \r\n to literal
s/\\\\/\\/g; # Convert escaped \ to literal
s/ auto_increment//g; # Remove auto_increment
s/^[UN]*?LOCK TABLES.*//g; # Remove locking statements
print;
}
问题是在以下 MySQL 字符串的情况下:
'It doesn\'t work :-\\'
它生成错误的 SQLite 字符串:
'It doesn''t work :-\''
而不是正确的:
'It doesn''t work :-\'
脚本有什么问题?
编辑:
以及如何解决?
解决方案
这是因为你在处理\'
之前\\
。您需要按照遇到的顺序处理反斜杠,因此您需要一次性完成所有操作。
#!/usr/bin/perl
my %escapes = (
n => "\n",
r => "\r",
);
while (<>) {
s{\\([\Wrn])}{ $escapes{$1} // ( $1 eq "'" ? "''" : $1 ) }eg;
s/ auto_increment//g;
next if /^(?:UN)?LOCK TABLES/;
print;
}
注意可选匹配的正确方法UN
。
推荐阅读
- python - 给定使用python的最后一列的值,我将如何获取csv文件中第一列或第二列的值
- selenium - 观察我没有管理员权限的不和谐服务器
- angular - 使用 Angular 10 ssr 实现 Facebook Pixel
- postgresql - 尝试访问 Amazon RDS 数据库实例时来自 Lambda 的超时错误
- algorithm - 一个小时后才返回的函数的代码 - 面试问题
- django - 为什么 Django/console 给我一个 stripe.confirmCardPayment 意图密码缺失值的错误,说它应该是一个客户端密码字符串?
- java - Hibernate 5 使用复合键的重复映射
- flutter - 从子小部件的 ListView 构建器中删除项目
- javascript - 如何使用特定 ID 将项目保存在本地存储中
- c++ - 将mysql连接器c ++字段值的原始4字节解释为日期