MySQL对-1的强制转换返回18446744073709551615
我似乎找不到对此的解释,而且我很确定它以前是按预期工作的MySQL对-1的强制转换返回18446744073709551615,mysql,casting,Mysql,Casting,我似乎找不到对此的解释,而且我很确定它以前是按预期工作的 SELECT CAST(-1 AS UNSIGNED INTEGER); 预期值:0 结果:18446744073709551615 有什么变化吗,或者这是MySQL错误 [更新] 好的,我想我找到了一个原因,为什么它以前似乎有效: SELECT CAST(-1.0 AS UNSIGNED INTEGER); +--------------------------------+ | CAST(-1.0 AS UNSIGNED INTEG
SELECT CAST(-1 AS UNSIGNED INTEGER);
预期值:0结果:18446744073709551615 有什么变化吗,或者这是MySQL错误 [更新] 好的,我想我找到了一个原因,为什么它以前似乎有效:
SELECT CAST(-1.0 AS UNSIGNED INTEGER);
+--------------------------------+
| CAST(-1.0 AS UNSIGNED INTEGER) |
+--------------------------------+
| 0 |
+--------------------------------+
现在,有人能解释一下这造成的区别吗?。。事实上,我在文件里找到了
如果任一操作数是浮点值,则结果为
浮点值,不受上述规则的影响
从:
MySQL支持有符号和无符号64位值的算术运算。如果您使用的是数字运算符(如+或-),且其中一个操作数是无符号整数,则默认情况下,结果是无符号的(请参阅第11.6.1节“算术运算符”)。您可以通过使用有符号或无符号强制转换运算符将值分别强制转换为有符号或无符号64位整数来重写此操作
mysql> SELECT CAST(1-2 AS UNSIGNED)
-> 18446744073709551615
mysql> SELECT CAST(CAST(1-2 AS UNSIGNED) AS SIGNED);
-> -1
基本上,通过您的cast,您可以告诉
MySQL
如何处理0xffffffffffff
。签名时为-1
,未签名时为18446744073709551615
。18446744073709551615
正好是2^64-1。我不希望有任何其他输出。&阿尔瓦罗·G·维卡里奥:感谢您的解释SELECT CAST(-1.0为无符号INT)
给出警告(在出现警告之前运行warnings
):“错误(代码1292):截断了不正确的十进制值:“””。@Lekensteyn:感谢您指出警告,尽管警告有点混乱,因为手册中指出:“在此上下文中,十进制列值被视为浮点值。”