首页 > 解决方案 > 更新 MEDIUMBLOB 时出现不希望的数据截断

问题描述

我正在尝试使用 PHP 发布调用在我的 MariaDB 中写入 BLOB。这个 BLOB 来自于从画布中获取 BASE64:

var data= $('#signatureDiv').signature('toDataURL');
var base64data= data.replace(/^data:image\/(png|jpg);base64,/, "");

$.post("myFunc.php", {imgContents: base64data}, function(data) {});

现在,在 myFunc.php 中:

$imgContents = $_POST['imgContents'];
$decodedPNG = base64_decode($imgContents);

$defTest = "UPDATE recogidas SET FirmaProv = ':blobFirma' WHERE ID=$index";
$preparedpdo = $mypdoObject->prepare($defTest);
$preparedpdo->bindParam(':blobFirma', $decodedPNG, PDO::PARAM_LOB);
$preparedpdo->execute();
echo $decodedPNG;

我对 PNG 进行解码以将其保存为 BLOB。然后我准备一个 SQL 更新来将此 BLOB 上传到适当的 MEDIUMBLOB 列。但是,数据总是被截断为几个字节!!正是这些字节:

3A626C6F624669726D61

当它作为 PNG 时,需要大约 100Kb。我在 PHP 开始时尝试使用它:

ini_set("odbc.defaultlrl", "1000K");

但它没有效果。为了确保解码正确,我尝试回显解码后的 BLOB,如果正确则返回。

为什么我的数据库将数据截断为一包字节?

额外信息:无论我在画布中制作的图片如何,上传到数据库的数据总是那些相同的字符。

标签: phpblobmariadbtruncation

解决方案


为什么我的数据库将数据截断为一包字节?

它不是。如果您费心检查这些十六进制字节的3A626C6F624669726D61实际含义,您会发现它是:blobFirma. 并且由于您指示数据库在语句中存储该字符串值,这绝对是预期的结果。

如果您不想将固定字符串值存储到列中 - 然后从语句中删除占位符周围的引号......</p>


推荐阅读