我正在尝试以二进制形式保存字符串以节省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)
,如上所示,但没有任何成功。提前谢谢。
答案 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管理工具将预期数据插入到数据库中 只有这样才能分辨问题是否与检索或插入本身相关