PHP / PDO / MySQL:插入MEDIUMBLOB会存储错误数据
||
我有一个简单的PHP Web应用程序,该应用程序通过文件上传接受图标图像并将其存储在MEDIUMBLOB列中。
在我的计算机(Windows)和两个Linux服务器上,这可以正常工作。在第三台Linux服务器上,插入的映像已损坏:执行SELECT后不可读,并且MySQL length()函数报告的列数据长度比上载文件的大小大40%。
(每个服务器都连接到一个单独的MySQL实例。)
当然,这使我考虑了编码和字符集问题。 BLOB列没有关联的字符集,因此似乎最可能的罪魁祸首是PDO及其对该列的参数值的解释。
我尝试将bindValue与PDO :: PARAM_LOB结合使用,没有任何效果。
我已经验证了服务器上已正确接收了图像(即在上传后毫无问题地读取图像),因此这肯定是DB / PDO问题。
我已经搜索了服务器之间明显的配置差异,但是我不是PHP配置方面的专家,因此我可能会错过一些东西。
插入代码大致如下:
$imagedata = file_get_contents($_FILES[\"icon\"][\"tmp_name\"]);
$stmt = $pdo->prepare(\'insert into foo (theimage) values (:theimage)\');
$stmt->bindValue(\':theimage\', $imagedata, PDO::PARAM_LOB);
$stmt->execute();
任何帮助将不胜感激。
更新:有问题的服务器上的默认MySQL字符集是utf8。在其他人身上是拉丁的。
通过在PDO构造函数中添加“ 1”来“解决”问题。
在我看来,这似乎是个错误的设计:为什么连接的字符集对二进制列的数据有任何影响,特别是当使用PARAM_LOB将其识别为PDO本身的二进制数据时?
请注意,在所有情况下,数据库表都定义为latin1:只有服务器的默认字符集不一致。
没有找到相关结果
已邀请:
1 个回复
导力疵谜