【问题标题】:PHP MySQL Saving Binary string into BLOB Field can't retrieve binary valuePHP MySQL将二进制字符串保存到BLOB字段中无法检索二进制值
【发布时间】:2018-02-16 17:35:55
【问题描述】:

我正在尝试以二进制形式保存一个字符串以节省我的 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),但没有任何成功。提前致谢。

【问题讨论】:

  • VALUES(1, b'10000001' 如果这是您的实际查询,则它失败了。为什么在引用值的内部和外部都有b
  • @Fred-ii-,告诉数据库它是一个二进制值?我在互联网上读到,不确定或是否正确,但我无法找到任何解决方案..?
  • 你可能是对的。您标记为 php,是否有相关代码?当你在 phpmyadmin(或类似的)中运行它时,它会抛出什么错误?我不清楚ID INT NOT,NOT,我以前从未见过。
  • @TVAvanHesteren 不在 mysql 中。要么使用准备好的语句并绑定在不受干扰的二进制数据中,要么对数据进行十六进制编码,如0x81
  • @Sammitch,你能给我提供任何代码吗?

标签: php mysql binary blob


【解决方案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' 为前缀的十六进制编码数据是 [据我所知] 将二进制数据嵌入文本查询中的唯一安全方式,尽管最好尽可能使用准备好的语句作为十六进制编码数据,例如这使长度加倍。

【讨论】:

    【解决方案2】:

    最好的建议是检查插入查询是否成功运行,即使用任何 MySQL 管理工具将预期数据插入数据库。
    只有这样,您才能确定问题出在检索还是 insets 本身

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-19
      • 2012-08-27
      • 2011-08-13
      • 1970-01-01
      • 1970-01-01
      • 2012-10-05
      相关资源
      最近更新 更多