8

我正在使用 Perl 编写一个 .sql 文件,而不是直接写入 mysql 数据库。我需要引用该文件中的字符串。看起来 $dbh-quote() 方法可以满足我的要求。除了我不知道如何在没有数据库连接的情况下使用它。我会建立一个虚拟连接,但如果没有数据库运行,我似乎无法做到这一点,而且要运行这个 cron 作业的机器也没有。

这个问题类似:Perl DBI without access the database and the accepted answer指出“您可能会尝试加载您需要的驱动程序并直接调用该函数”,这是我想做的,但我不知道怎么做。

4

3 回答 3

4

可靠的引用要求驱动程序理解连接的字符集/排序规则,因为转义会根据该信息而变化。

这就是为什么在 PHP 中 mysql_escape_string() 被替换为 mysql_real_escape_string(),它使用数据库连接属性来正确地转义输入字符串。

于 2012-08-20T00:45:30.887 回答
3

听起来您将不得不弄清楚做什么quote并自己实施。无法访问真正的数据库连接可能会成为阻碍。

于 2012-08-19T23:28:34.890 回答
0

听起来答案是响亮的“你做不到”。无论如何,这里是我根据 mysql 文档http://dev.mysql.com/doc/refman/5.0/en/string-literals.html关于需要引用的内容的引用函数。

我的输入是 UTF-8,perl 在内部以 UTF-8 存储字符串,我的输出是 UTF-8,我的数据库是 UTF-8。鉴于字符集是一致的,我不需要为转义目的而担心太多。

sub quote(){
    my ($s) = @_;
    $s =~ s/\\\\/\\/g;
    $s =~ s/\'/\\'/g;
    $s =~ s/\"/\\"/g;
    $s =~ s/\x08/\\b/g;
    $s =~ s/\n/\\n/g;
    $s =~ s/\r/\\r/g;
    $s =~ s/\t/\\t/g;
    $s =~ s/\x1A/\\Z/g;
    return $s;
}

我测试了这个功能,它似乎做了我想要的。太糟糕了,这样的东西不能从已经编写好的库中访问。

于 2012-08-20T13:48:18.277 回答