【问题标题】:PHP, reading 8 byte integers from a MySQL database?PHP,从 MySQL 数据库中读取 8 字节整数?
【发布时间】:2014-06-09 08:05:11
【问题描述】:

我在 MySQL 中有一个 BINARY(40) 列,在那里我存储了 5 个 8 字节整数。我正在尝试在 PHP 中一一读取这些数字:

$result = mysqli_query($con,"SELECT data FROM list WHERE id=".$id);
$mysql_array = mysqli_fetch_array($result);
$list = str_split($mysql_array["data"], 8);
for($i = 0; $i < 5; $i++)
    echo $list[$i]."<br/>";

打印的不是我期望的数字,而是奇怪的符号。如何将这些数字从二进制字符串转换为整数?

【问题讨论】:

  • 你能显示打印的“奇怪符号”的输出吗?
  • 显示代码如何存储整数。
  • @rink.attendant.6:一个接一个有很多'�'。
  • 您在返回数字时将它们转换为字符串,您需要将它们转换回来,但除非您安装了 64 位 PHP,否则如果不使用将不会很容易处理计算的大数字库。
  • @Luka 空间真的如此受限以至于每行几个字节有那么重要吗?最后我检查了存储非常便宜。此外,这不是性能或存储的问题,而是正确性的问题。我对数据库有足够的经验,知道尝试将多个数据放在一列中几乎总是一个糟糕的想法,并且不可避免地会再次困扰您

标签: php mysql


【解决方案1】:

如下更改您的查询:

$result = mysqli_query($con,"SELECT cast(data as char(40)) FROM list WHERE id=".$id);

【讨论】:

  • 我得到 Undefined index: data on line $list = str_split($mysql_array["data"], 8);
  • @Luka Goodness, cast(data as char(40)) as data 使用别名来获取它。
  • 我得到的结果与我上面发布的代码相同
【解决方案2】:

好的,由于您存储数字的方式,此代码仅在您获得 64 位支持时才有效,否则您将不得不查看 bc 替换,应该不会太难:

for($i = 0; $i < 5; $i++) {
    $bin_str = $list[$i];
    $int_val = 0;
    for ($j = 0; $j < 8; ++$j) {
        $byte_val = ord(substr($bin_str, $j, 1));
        // push the next byte onto our integer:
        $int_val = ($int_val << 8) + $byte_val;
    }
    echo $int_val;
}

编辑:这很可能是 BC 等效的,但我目前无法对其进行测试,但逻辑保持不变。

for($i = 0; $i < 5; $i++) {
    $bin_str = $list[$i];
    $bc_val = '0';
    for ($j = 0; $j < 8; ++$j) {
        $byte_val = ord(substr($bin_str, $j, 1));
        // push the next byte onto our integer:
        $bc_val = bcadd(bcmul($bc_val, 256, 0), "$byte_val", 0);
    }
    echo $bc_val;
}

【讨论】:

  • 我有一个 32 位版本的 PHP。运行这段代码后,我没有得到预期的结果,但我至少得到了数字。我会更多地研究 BC。
  • @Luka,我已经对其进行了编辑以包含具有相同逻辑的 BC 版本,您可以检查一下吗?
  • 我得到一些 64 位数字,但这些数字不是存储在数据库中的数字。我会尝试看看错误是否在我身上。无论如何,谢谢你帮助我!
  • 这可能是数字的字节序,你能得到两个数字的十六进制并比较吗?
  • 这就是为什么每列有多个数据是个坏主意:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-16
  • 2012-10-19
相关资源
最近更新 更多