首页 > 解决方案 > 如何使用 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)

标签: phppostgresqlgmp

解决方案


在插入数据库之前减去 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);

推荐阅读