我似乎无法找到解释,我很确定它之前已按预期工作。
SELECT CAST(-1 AS UNSIGNED INTEGER);
预期:0
结果:18446744073709551615
是否有变化,或者这是MySQL的错误?
[UPDATE] 好吧,我认为我找到了之前似乎有效的原因:
SELECT CAST(-1.0 AS UNSIGNED INTEGER);
+--------------------------------+
| CAST(-1.0 AS UNSIGNED INTEGER) |
+--------------------------------+
| 0 |
+--------------------------------+
现在,有人可以解释这导致的差异吗?实际上,我在文档中找到了!
如果任一操作数是浮点值,则结果为a 浮点值并且不受前面规则的影响。
答案 0 :(得分:11)
来自docs:
MySQL支持带有符号和无符号64位值的算术。如果使用数字运算符(例如+或 - )且其中一个操作数是无符号整数,则默认情况下结果为无符号(请参见第11.6.1节“算术运算符”)。您可以通过使用SIGNED或UNSIGNED强制转换运算符将值重写为有符号或无符号的64位整数。
mysql> SELECT CAST(1-2 AS UNSIGNED) -> 18446744073709551615 mysql> SELECT CAST(CAST(1-2 AS UNSIGNED) AS SIGNED); -> -1
基本上,随着你的演员,你告诉MySQL
如何对待0xFFFFFFFFFFFFFFFF
。签名后为-1
,未签名时为18446744073709551615
。