PHP MySQL将二进制字符串保存到BLOB字段中无法检索二进制值

时间:2017-09-07 21:42:49

标签: php mysql binary blob

我正在尝试以二进制形式保存字符串以节省MySQL数据库中的空间。但是,我无法正确检索二进制数据,所以我做错了什么?

我有一个像:

这样的数据库
CREATE TABLE `Test` (
    ID INT NOT,
    Value BLOB
    );

我使用以下语句插入数据:

INSERT INTO `Test` (ID, Value) VALUES(1, b'10000001');

但是,当我使用下面的查询从插入的行中选择值时,我无法检索二进制字符串:

SELECT * FROM `Test`; //NOT WORKING. Returns Value=0
SELECT ID, BIN(Value) FROM `Test`; //NOT WORKING. Returns Value=0

我应该使用什么?我已经尝试在我的查询中使用BIN(Value),如上所示,但没有任何成功。提前谢谢。

2 个答案:

答案 0 :(得分:1)

从一个1和0的文字字符串开始是非常奇怪的,但是:

$ones_and_zeroes = '10000001';

// If you have a literal string of ones and zeroes that you need to convert
// to an actual number there's base_convert()

$hex_string = base_convert($ones_and_zeroes, 2, 16); 

// $hex_string is now "81"

// you can convert this to an *actual* binary string with hex2bin()
$bin = hex2bin($hex_string);

// $bin now contains the byte 0x81

// now if you want to do it right:
$dbh = new PDO( ... );
$stmt = $dbh->prepare('INSERT INTO `Test` (ID, Value) VALUES(1, :bin)');
$stmt->execute(['bin'=>$bin]);

// or whatever the gross mysqli equivalent is.

我不打算告诉你如何在PHP中使用错误的,但是你想要手写这个查询:

INSERT INTO `Test` (ID, Value) VALUES(1, 0x81);

前缀为'0x'的十六进制编码数据是[我所知]在文本查询中嵌入二进制数据的唯一安全方式,尽管最好尽可能使用预准备语句作为十六进制编码数据,如这个长度增加了一倍。

答案 1 :(得分:0)

最好的建议是检查插入查询是否成功运行,即使用任何MySQL管理工具将预期数据插入到数据库中 只有这样才能分辨问题是否与检索或插入本身相关