如何获取select以输出转义的“\0”字符

xkrw2x1b  于 2021-06-25  发布在  Mysql
关注(0)|答案(1)|浏览(553)

运行查询#1时:

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

有一个字段值输出为:

  1. blah\0

我试图得到相同的输出不使用 INTO OUTFILE .
用perl代码查询#2:

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

但是,上面的列输出为

  1. blah

所以 \0 字符(ascii nul)的输出方式不同。如何将查询#2修改为输出 blah\0 ?
修改可以在mysql查询或perl中进行。列的排序规则是utf8\u general\u ci。我试过用 CONVERT($column using utf8) 但它仍然显示 blah ,并且我不确定在输出时如何将它应用于每个表的每一列。
更新:
这段perl代码用于转义nul字符。

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

但是mysql还有很多其他的特殊字符,有没有一种方法可以一次将它们全部转义,而不是逐个处理它们呢?

yk9xbfzb

yk9xbfzb1#

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

  1. my $sth = $dbh->prepare("select '\0'");
  2. $sth->execute;
  3. while (my $row = $sth->fetch) {
  4. my ($col) = @$row;
  5. print "[$col] is quoted as ", $dbh->quote($col), "\n";
  6. }

在我的mysql版本中:

  1. [] is quoted as '\0'

如果我通过管道 hexdump -C 我们得到

  1. 00000000 5b 00 5d 20 69 73 20 71 75 6f 74 65 64 20 61 73 |[.] is quoted as|
  2. 00000010 20 27 5c 30 27 0a | '\0'.|
  3. 00000016
展开查看全部

相关问题