php - 如何使用 PHP 为 2^63-1 (signed int) 列准备 2^64 (unsigned bigint)?
问题描述
我需要将数字存储17557386533328272186
在签名的 bigint 列中。
Postres 不支持无符号字段,因为 SQL 规范没有定义无符号字段。因此,可以存储在 Postgres bigint 列中的最大整数是9223372036854775807
.
如果我想存储这个感知散列库中的值,我需要能够存储一个经常在 2^64 范围内的无符号整数。
我的号码由 GMP 处理,因此基于 GMP 的解决方案是一个很好的解决方案。
我最终得到的是这个。
签名为未签名(sql to working):
gmp_strval(gmp_add(gmp_init($theirPhash, 10), gmp_pow(2, 63)), 16))
无符号到有符号(对于 sql):
gmp_strval(gmp_sub(gmp_init("0x{$fileHash->toHex()}", 16), gmp_pow(2, 63)), 10)
解决方案
在插入数据库之前减去 2^63,然后在检索时再次添加:
$max = '9223372036854775807'; // 2^63
$realValue = '17557386533328272186';
$dbValue = gmp_sub($realValue, $max);
var_dump($dbValue);
// INSERT (?), $dbvalue
// Get the value back again
// $dbValue = SELECT dbValue
$realValue = gmp_add($dbValue, $max);
var_dump($realValue);
推荐阅读
- error-handling - 在 Smalltalk/Pharo 中创建以块为参数的键值消息
- java - 由于缓慢的 IO 调用,Google Dataflow 的工作人员几乎处于空闲状态
- javascript - Typescript Promise 拒绝类型
- svg - SVG 旋转(矩阵)矩形的宽度。看起来像宽度和高度数字被缩放
- php - 如何获取数组的值?
- reactjs - Redux 表单:访问 JSX 表单中的字段组件 meta.touched 属性
- python - 用于词嵌入的卷积模型中 keras 中 Flatten 后大小不兼容的密集层
- csv - Linux shell:检测 CSV 日志文件的状态变化
- python - 自动转换“|” 换行符,但如果在括号内则不行?
- php - 致命错误:未捕获的错误:在解析数据时调用字符串上的成员函数 find()