如何让SELECT输出转义" \ 0"字符

时间:2016-10-06 22:07:10

标签: mysql perl character-encoding escaping ascii

当我运行查询#1时:

SELECT * FROM $TABLE INTO OUTFILE $FILE CHARACTER SET utf8 FIELDS ESCAPED BY '\\\\' TERMINATED BY '|';

有一个字段值输出为:

blah\0

我试图在不使用INTO OUTFILE的情况下获得相同的输出。

使用Perl代码查询#2:

$query = $db->prepare("SELECT * FROM $TABLE");
$query->execute;
open(FILE_OUT, ">$FILE");

但是,上面的同一列输出为

blah

因此\0字符(ASCII NUL)的输出方式不同。如何修改查询#2以输出blah\0

修改可以是MySQL查询或Perl。列的排序规则是utf8_general_ci。我尝试使用CONVERT($column using utf8),但仍显示blah,而且我不确定在输出时如何将其应用于每个表的每一列。

更新

此Perl代码用于转义NUL字符。

$row =~ s/\0/\\0/g;

但是还有很多其他的MySQL特殊字符,有没有办法一次性将它们全部转义而不是逐个处理它们?

1 个答案:

答案 0 :(得分:1)

数据库句柄的quote method应该能够引用任何特殊字符:

my $sth = $dbh->prepare("select '\0'");

$sth->execute;
while (my $row = $sth->fetch) {
        my ($col) = @$row;
        print "[$col] is quoted as ", $dbh->quote($col), "\n";
}

在我的MySQL版本上打印:

[] is quoted as '\0'

如果我通过hexdump -C通过管道传输

00000000  5b 00 5d 20 69 73 20 71  75 6f 74 65 64 20 61 73  |[.] is quoted as|
00000010  20 27 5c 30 27 0a                                 | '\0'.|
00000016