PHP,从MySQL数据库读取8字节整数?
我在MySQL中有一个二进制(40)列,在那里我存储了5个8字节的整数。我正在尝试用PHP逐一阅读这些数字: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 $
$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;
}