如何使用 PHP 为 2^63-1(signed int)列准备 2^64(unsigned bigint)?

How to prepare a 2^64 (unsigned bigint) for a 2^63-1 (signed int) column using PHP?

我需要将数字 17557386533328272186 存储在带符号的 bigint 列中。

Postres 不支持无符号字段,因为 SQL 规范没有定义无符号字段。因此,可以存储在 Postgres bigint 列中的最大整数是 9223372036854775807.

如果我想存储来自 this perceptual hashing library 的值,我需要能够存储一个 unsigned int,它通常在 2^64 范围内。

我的号码由 GMP 处理,因此基于 GMP 的解决方案是一个很好的解决方案。


我最后得到的是这个。

有符号到无符号(sql 有效):
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);