2015-10-20 68 views
0

我试图在SQL中实现一个特殊的哈希算法来对我们的一些数据进行哈希处理。我几乎在那里,但我坚持在最后一步。SQL Server按位与(与JavaScript的区别)

尝试这段代码在SQL:

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

使用下面的代码给我2912047312

但是在JavaScript:

console.log(2912047312 & 2912047312);

结果将是-1382919984

我在SQL中做了什么错误,请阅读转换为bigint的必要性,但操作总是返回相同的值。

SQL数据库:SQL Server 2008中10.50.6000

+0

它在Java中是什么数据类型? – Matt

+0

发布可执行的JS代码。 – usr

+0

请标记dbms产品使用? (这不是ANSI SQL。) – jarlh

回答

2

的Javascript

Javascript is using 32 bit signed integers在进行位运算(汤姆链接它已经)。由于您的值大于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,所以结果将在一个更大的数据类型来计算,也不会发生溢出。

所以区别是因为两个系统在按位操作中使用不同的数据类型,其中一个系统无法处理您提供的值而没有溢出,因此无需更改实际值。

编辑

你可以“仿真”用小窍门溢出:

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

CAST(2912047312 AS BIGINT) & CAST(2147483647 AS BIGINT)部分将下降64位整数值的上部(上部的32位是0s,对于2147483647值,较低的32位是1,这是使用32位整数的最大值)。

然后它将结果添加到有符号的32位整数(-2147483648)的最小值。

+0

如果我理解错误(希望我理解正确),请纠正我。所以SQL可以使用BIGINT处理64位,但JavaScript不会,但它不会通过抛出错误等“告诉我们”来处理整数的下半部分。 另外我假设我不能在SQL中做任何事情,因为它会导致算术溢出,但是我可以将它们转换,以便SQL像对待JavaScript一样对待它们吗? 我可能在这里很厚,道歉,2912047312'怎么变成'-1382919984'? – Moseleyi

+0

是的,你可以,看看编辑,否则你理解正确 – Pred

+0

我看到..它确实有道理,我认为它几乎完美 'SELECT(-2147483647 +(CAST(2912047312 AS BIGINT)&CAST(2147483647 AS BIGINT )))''-1382919983' 'console.log(2912047312&2912047312);''-1382919984' 有1个区别..应该在上述操作之后为sql结果添加1吗? – Moseleyi