9

我在 PHP 中有一个字符串(来自某些数据源),它表示一个格式化的无符号 32 位整数。我需要将它作为带符号的32 位整数存储到 MySQL 数据库中,以便稍后我可以从 PHP 中检索它并将其用作(可能为负的)有符号整数常量(因为 PHP 没有无符号整数)。

所以,我需要的是一种转换方法,适用于 PHP 或 MySQL。它不应该依赖于平台(没有字节序/ 32/64 位问题)。

我知道如何使用 MySQL 将有符号整数转换为无符号整数:

select CAST((-1062726980 & 0xFFFFFFFF) AS UNSIGNED INTEGER);
+------------------------------------------------------+
| CAST((-1062726980 & 0xFFFFFFFF) AS UNSIGNED INTEGER) |
+------------------------------------------------------+
|                                           3232240316 | 
+------------------------------------------------------+

但我不能让它反过来工作(注意:MySQL 在进行强制转换时使用 64 位算术)。

谢谢。

4

3 回答 3

3

如果您只是将数字转换为 PHP 中的整数,它就可以解决问题。

echo (int)3232240316 . "\n";

-1062726980

注意:如果你想在 PHP 中将有符号整数转换为无符号整数,只需执行以下操作:

$number += 4294967296;

例子:

$number = -1062726980;
echo $number . "\n";
$number += 4294967296;
echo $number . "\n";

给出:

-1062726980
3232240316
于 2009-07-18T13:23:42.900 回答
1

纯MySQL解决方案:

SELECT CAST((yourUnsigned<<32) AS SIGNED)/(1<<32)

yourUnsigned当在 0..4294967295 范围内时,为您提供 32 位补码 UNSIGNED->SIGNED 转换。已签名->未签名很容易:

SELECT yourSigned & 0xFFFFFFFF;
于 2020-03-29T08:03:12.227 回答
0

这:

$val = (bccomp("2147483647", $val) < 0) ? bcsub($val, "4294967296") : $val;

似乎工作,即使它有点慢。

于 2009-07-19T10:31:00.627 回答