gpt4 book ai didi

php - MySQL 中存储的二进制数据被损坏

转载 作者:行者123 更新时间:2023-11-30 01:00:24 26 4
gpt4 key购买 nike

我需要在 MySQL 数据库中存储 50 KiB - 500 KiB 二进制文件(实际上是 zlib 压缩文本文件)。假设有充分的理由这样做,而不是仅仅将它们写入文件系统,那么我遇到了数据库中数据损坏的问题。我用 PHP 和 Python 都把它拉出来了,都显示数据已损坏。

我曾尝试使用 PHP 模拟准备语句和非模拟准备语句来输入数据,以及简单地将数据放在查询中,就好像它是字符串一样。所有这些都导致数据损坏。

使用准备好的语句:

$options = array('PDO::ATTR_EMULATE_PREPARES' => FALSE);
$dsn = 'mysql:host=localhost;dbname=qb_cache;charset=utf8';
$pdo = new PDO($dsn, 'root', 'hunter2', $options);

$sql = 'INSERT INTO cache (body) VALUES (:body)';
$stmt = $pdo->prepare($sql);
$stmt->bindValue(':body', $body);

使用模拟的准备好的语句:

$dsn = 'mysql:host=localhost;dbname=qb_cache;charset=utf8';
$pdo = new PDO($dsn, 'root', 'hunter2');

$sql = 'INSERT INTO cache (body) VALUES (:body)';
$stmt = $pdo->prepare($sql);
$stmt->bindValue(':body', $body);

直接进入数据库:

$dsn = 'mysql:host=localhost;dbname=qb_cache;charset=utf8';
$pdo = new PDO($dsn, 'root', 'hunter2');

$sql = "INSERT INTO cache (body) VALUES ('{$body}')";
$stmt = $pdo->prepare($sql);

请注意,没有 PDO PDO::PARAM_* constant对于二进制数据!顺便说一句,我不认为我达到了 MySQL 字段的大小限制:

mysql> show variables like 'max_allowed_packet';
+--------------------+----------+
| Variable_name | Value |
+--------------------+----------+
| max_allowed_packet | 16777216 |
+--------------------+----------+
1 row in set (0.00 sec)

这是我尝试解码时得到的结果:

$ zlib-flate -uncompress < output_from_database
...snip...
74 ARP4s0B64R9P6oZOpe6262E}C k3A AFD001 Si IL4A57sflate: inflate: data: invalid block type


$ cat output_from_database | openssl zlib -d > decoded
140438369359520:error:29065064:lib(41):BIO_ZLIB_READ:zlib inflate error:c_zlib.c:570:zlib error:data error

使用Python从MySQL中提取数据,我看到该字段的大小是正确的,但我无法解压缩它::

>>> pprint(zlib.decompress(row[0]))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
zlib.error: Error -5 while decompressing data: incomplete or truncated stream

最佳答案

问题是列类型是blob,因为某种原因我认为blob是MySQL支持的最大数据类型。事实证明,当我实际查看并看到数据库中的大小为 65535 字节时,我明白数据正在被截断。 移至longblob解决了该问题。

对于下一个人:MySQL Data Type Storage Requirements .

关于php - MySQL 中存储的二进制数据被损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20181276/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com