【问题标题】:MySQL export to CSV with blob fieldMySQL 使用 blob 字段导出到 CSV
【发布时间】:2011-11-22 02:01:21
【问题描述】:

我在使用 php 将 BLOB 导出到 csv 文件时遇到问题。显然 blob 不是一个普通的字段,但它偶尔会被使用。但这就是我需要的,我需要这个脚本通过获取一个表格数组并以 csv 格式导出每一行来工作。 Blob 搞砸了。我尝试对 blob 进行 base64_encode,但我相信这会错误地导出 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);
    }
}

任何帮助将不胜感激。

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

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

【问题讨论】:

  • 你不应该使用 base64_decode 吗?我不是 BLOBS 方面的专家,但如果你按照我的意思进行操作,我相信你不想对其进行编码以查看真实文本..
  • 您能否展示一下您的输出示例,以便我们查看问题所在?
  • 呵呵。抱歉,blob 只是二进制(嗯,加密的密码)。所以无论如何,任何类型的导出都是不可读的。但是 base64_encode() 的目标是让所有 fputcsv() 工作,因为 blob 具有所有类型的随机字符,blob 字段会损坏导出,因为它包含 \r \t 和 \n's。所以编码可以防止这些奇怪的问题,而且确实可以防止它们。
  • 好的,我明白了,但是当您说“我相信这会错误地导出 blob”时,您是什么意思。 ?如果您可以详细说明您对代码的期望以及它实际为您提供的内容,那么也许我可以帮助您:)
  • 谢谢丹妮。添加图像以显示我在说什么。那是没有base64的。所以我最大的问题是,base64 会正确编码任何字符并正确解码吗?因为 blob 是任何东西的混合物。

标签: php mysql csv export blob


【解决方案1】:

Base64 编码的目的是使二进制数据能够通过非 8 位干净的传输层进行传输,所以是的,你在正确的轨道上。

您真正需要担心的是 fputcsv() 函数。您需要检查哪些危险物品?

  1. 制表符,因为这是您的分隔符
  2. 换行符,因为您似乎也在逐行解析

根据this link,Base 64 编码仅跨越 A-Z、a-z、0-9、+ 和 /,这意味着您是安全的,并且您发布的图像中的新行可能是 IDE 中自动换行的产物您正在使用。现在你必须记住的是,当你想将这些数据导入回数据库时,不要期望只使用 mysqldump 或 mysql

您还应该知道,您当前正在编码所有字段,而不仅仅是 blob 数据。 Base64 编码作为 FYI 占用了大约 33% 更多的空间,因此您可能希望在表中定义一些位来指示该字段是否为 blod,并且您希望在其上启用 B64 编码。

【讨论】:

  • 感谢您提供此信息。经过各种测试,信息似乎是准确的。因此,使用 base64 对 blob 进行编码然后对其进行解码,就可以正常工作。另外,这有助于克服 csv 问题。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-24
  • 2011-04-25
  • 1970-01-01
  • 1970-01-01
  • 2011-12-05
  • 2016-01-25
相关资源
最近更新 更多