SQL 服务器按位与(与 JavaScript 的区别)

SQL Server Bitwise AND (differences with JavaScript)

我正在尝试在 SQL 中实施一种特殊的哈希算法来对我们的一些数据进行去哈希处理。我快到了,但我卡在了最后一步。

尝试 SQL 中的这段代码:

SELECT CAST(2912047312 AS BIGINT) & CAST(2912047312 AS BIGINT)

给我 2912047312

但是在 JavaScript 中使用以下代码:

console.log(2912047312 & 2912047312);

结果将是-1382919984

我是不是在 SQL 中做错了什么,阅读关于转换为 bigint 的必要性已经完成,但操作总是 returns 相同的值。

SQL 数据库:SQL Server 2008 10.50.6000

Javascript

Javascript is using 32 bit signed integers 同时执行按位运算(正如 Tom 已经链接的那样)。由于您的值大于 32 位整数的最大值,因此只会使用整数的较低部分(这是因为溢出)。

你可以通过执行一个简单的测试来测试它:console.log(2912047312 | 0) 它将打印你 -1382919984.

2912047312 & 2912047312 表达式中的两个操作数将被转换为 32 位整数,因此实际的按位运算将在 -1382919984 & -1382919984 表达式上执行。

有符号整数的范围是−2147483648+2147483647

SQL 服务器

SQL Server can perform bitwise operation on any integer type operands,包括bigint,所以结果会在更大的数据类型上计算,不会发生溢出。

所以区别是因为两个系统在按位运算中使用不同的数据类型,其中一个系统无法在不溢出的情况下处理您提供的值,因此不会更改实际值。

编辑

你可以 'emulate' 用一个小技巧来溢出:

SELECT (-2147483648 + (CAST(2912047312 AS BIGINT) & CAST(2147483647 AS BIGINT)));

CAST(2912047312 AS BIGINT) & CAST(2147483647 AS BIGINT)部分会去掉64位整数值的高位部分(高32位为0,低32位为1,对于2147483647这个值是使用32位整数的最大值).

然后它将结果与带符号的 32 位整数 (-2147483648) 的最小值相加。