在Postgres中存储Zip文件

时间:2014-08-04 20:20:01

标签: php mysql sql postgresql encoding

我已经将zip文件的内容存储在MySQL数据库的LONGBLOB中,但我正在转移到Postgres。根据我的阅读,与Postgres中的LONGBLOB相当的是bytea。不幸的是,我无法将zip内容写入数据库。首先,我收到了这个错误:

Warning: pg_query(): Query failed: ERROR:  invalid byte sequence for encoding "UTF8"
 0x5c

然后我使用SQL_ASCII编码创建了一个新数据库(之前有UTF8),并收到此错误:

PHP Warning:  pg_query(): Query failed: ERROR:  syntax error at or near "v╘▓ú5"
LINE 2: ...√╢V[úB√▬┌»å⌐²└ù╙±b±≡ß▼┐π}°ï»┌G╜₧╧εo»~°0o╞W/_╝ƒL¢\'v╘▓ú5;Ω░#╩...

有没有办法在没有编码的情况下在Postgres中创建数据库/表/列?如果没有,我该如何存储这些信息?我尝试使用pg_escape_bytea但是当我尝试解压缩内容时会产生错误。不确定这真的很重要,但这是我用来写入数据库的PHP:

$content = file_get_contents($zipLocation);
$content = addslashes($content);

$sql="INSERT INTO ZIP_TBL ( BUILD, CONTENT)
    VALUES ('$build', '$content')";

if (!pg_query($con,$sql)) {
    die('Error: ' . pg_last_error($con));
}

3 个答案:

答案 0 :(得分:2)

现在是切换到PDO的好机会,它可以干净利落地完成这类工作。

Here's an earlier answer I wrote on this topic,它讨论了旧式PostgreSQL驱动程序对二进制数据真正可怕的多种方式。

简短版本是您的代码应该更像:

$sth = $pdo->prepare('INSERT INTO mytable(somecol, byteacol) VALUES (:somecol, :byteacol)');
$sth->bindParam(':somecol', 'bork bork bork');
$sth->bindParam(':byteacol', $thebytes, PDO::PARAM_LOB);
$sth->execute();

答案 1 :(得分:1)

bytea输入格式之一是十六进制。所以请使用bin2hex

$content = file_get_contents($zipLocation);
$content = '\\x' . bin2hex($content);

$sql="
    insert into zip_tbl ( build, content)
    values ('$build', E'$content')
";

http://www.postgresql.org/docs/current/static/datatype-binary.html#AEN5318

http://php.net/manual/en/function.bin2hex.php

顺便说一句,如果你不知道,你很容易受到SQL注入。

答案 2 :(得分:0)

尝试使用base64encode()函数:

$content = file_get_contents($zipLocation);
$content = base64encode($content);

$sql="INSERT INTO ZIP_TBL ( BUILD, CONTENT)
    VALUES ('$build', '$content')";

if (!pg_query($con,$sql)) {
    die('Error: ' . pg_last_error($con));
}

当您需要此数据时,请使用base64decode()函数。此外,列的类型需要是用于存储此数据的文本。

  
    

string base64_encode(string $ data)

         

string base64_decode(string $ data [,bool $ strict = false])

  

http://php.net//manual/en/function.base64-decode.php

http://php.net//manual/en/function.base64-encode.php