2011-11-22 254 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