2016-10-06 23 views
2

当我运行查询#1:如何获得选择输出转义“ 0”字符

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

有是输出,因为这一个字段值:

blah\0 

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

查询#2用Perl代码:

$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的特殊字符,有没有办法一下子逃脱他们所有,而不是处理它们一个接一个?

+0

你会在[本帖]中找到很多相关信息(http://stackoverflow.c OM /问题/ 881194 /怎么办-I-转义特殊字符,在MySQL的)。要打印NUL,你可以使用[pack](http://perldoc.perl.org/functions/pack.html)。参见教程[perlpacktut](http://perldoc.perl.org/perlpacktut.html)。最后,你总是可以用整个字符串的正则表达式来反斜杠,但这可能不会削减它。 – zdim

回答

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