Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP,从MySQL数据库读取8字节整数?_Php_Mysql - Fatal编程技术网

PHP,从MySQL数据库读取8字节整数?

PHP,从MySQL数据库读取8字节整数?,php,mysql,Php,Mysql,我在MySQL中有一个二进制(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 $

我在MySQL中有一个二进制(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/>";
$result=mysqli_query($con,“从列表中选择数据,其中id=“.id”);
$mysql\u array=mysqli\u fetch\u array($result);
$list=str_split($mysql_数组[“数据”],8);
对于($i=0;$i<5;$i++)
echo$list[$i]。“
”;

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

按如下方式更改查询:

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

好的,由于您存储数字的方式,只有在您获得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;
}
($i=0;$i<5;$i++)的
{
$bin_str=$list[$i];
$int_val=0;
对于($j=0;$j<8;++$j){
$byte_val=ord(substr($bin_str,$j,1));
//将下一个字节推到整数上:

$int_val=($int_val)您能显示打印的“奇怪符号”的输出吗?显示您如何存储整数的代码。@rink.attendant.6:有很多'�' 一个接一个。当你返回数字时,你要把它们转换成字符串,你需要把它们转换回来,但是除非你安装了64位的PHP,否则如果不使用一个大的数字库来处理计算,这将是不容易的。@Luka的空间真的如此有限以至于每行几个字节有那么大的影响吗?上一次我检查了storage非常便宜。此外,这不是性能或存储的问题,而是正确性的问题。我对数据库有足够的经验,知道尝试在一列中放置多个数据几乎总是一个可怕的想法,这将不可避免地困扰你。我得到了未定义的索引:第
行上的数据$list=str\u split($mysql_数组[“data”],8);
@Luka Goodness,
cast(数据为字符(40))as data
使用别名获取数据。我得到的结果与上面发布的代码相同。我有一个32位版本的PHP。运行此代码后,我没有得到预期的结果,但我至少得到了数字。我将进一步研究BC。@Luka,我已对其进行了编辑,以包含具有相同逻辑的BC版本,你能检查一下吗?我得到一些64bit个数字,但这些数字不是存储在数据库中的数字。我将尝试查看错误是否在我这方面。无论如何,感谢您的帮助!可能是数字的尾数,您可以获取两个数字的十六进制数并进行比较吗?这就是为什么每列多个数据是个坏主意:)
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;
}