2016-10-06 72 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