2011-11-22 257 views
0

我有一个问题,导出BLOB到一个CSV文件使用PHP。显然blob不是一个正常的字段,但它偶尔会被使用。但这里是我需要的,我需要这个脚本通过获取表格数组并以csv格式导出每一行来工作。 Blob搞砸了。我试过对blob进行base64_encode,但我相信会错误地导出blob。MySQL导出为CSV与blob字段

这是我到目前为止有:

function exportcsv($tables) { 
    foreach ($tables as $k => $v) { 
     $fh = fopen('sql/'.$v.'.csv', 'w'); 
     $sql = mysql_query("SELECT * FROM $v"); 
     while ($row = mysql_fetch_row($sql)) { 
      $line = array(); 
      foreach ($row as $key => $v) { 
       $line[] = base64_encode($v); 
      } 
      fputcsv($fh, $line, chr(9)); //tab delimiting 
     } 
     fclose($fh); 
    } 
} 

任何帮助,将不胜感激。

编辑:这是blob导出没有base64_encode()的图像。 https://www.strongspace.com/shared/crypok1lxb

那么,base64会在需要重新导入时保护blob的格式吗?

+0

不应该使用base64_decode吗?我不是BLOBS的专家,但我相信你不想编码它看到真正的文本,如果你按照我的意思.. –

+0

你可能会显示你有输出的样本,以便我们可以看到什么是错的? –

+0

呵呵。对不起,blob只是二进制(好的,加密的密码)。所以无论如何它对于任何类型的输出都是不可读的。但是base64_encode()的目标是让所有的fputcsv()工作,因为blob具有blob字段会损害导出的所有类型的随机字符,因为它包含\ r \ t和\ n's。所以编码可以防止这些奇怪的问题,并且确实阻止了它们。 – frustratedtech

回答

1

Base64编码的目的是为了使二进制数据通过不是8位传输层的传输层保持传输状态,所以是的,你正处于正确的轨道上。

你真的需要担心的是fputcsv()函数。你需要检查什么是危险物品?

  1. 标签,因为这是你的分隔符
  2. 换行符,因为它似乎你也可以通过线分析

this link,基地64只编码跨越包括AZ,az,0〜 9,+和/,这意味着你是安全的,并且你发布的图像中的新行可能是你正在使用的IDE封装的文字。现在你必须记住的是,当你想将这些数据导回到数据库时,不要指望只使用mysqldump或者mysql <来管理它。你将不得不创建另一个php函数,它使用base64_decode以将数据恢复到原始状态。

您还应该知道,您当前编码的是所有字段,而不仅仅是blob数据。作为参考,Base64编码占用了大约33%的空间,因此您可能需要指定一些表格来指示该字段是否方便,并且您希望在其上启用B64编码。

+0

谢谢你为这个信息。在各种测试中,它显示的信息是确切的。因此,使用base64编码一个blob然后解码它,就像它应该那样工作。此外,这有助于通过csv问题。谢谢! – frustratedtech