MySQL转换为-1返回18446744073709551615

Cez*_*Cez 7 mysql casting

我似乎无法找到这方面的解释,我很确定它之前已按预期工作.

SELECT CAST(-1 AS UNSIGNED INTEGER);
Run Code Online (Sandbox Code Playgroud)

预期:0
结果:18446744073709551615

有什么变化,或者这是一个MySQL错误?

[更新]好的,我认为我找到了之前似乎有效的原因:

SELECT CAST(-1.0 AS UNSIGNED INTEGER);
+--------------------------------+
| CAST(-1.0 AS UNSIGNED INTEGER) |
+--------------------------------+
|                              0 |
+--------------------------------+
Run Code Online (Sandbox Code Playgroud)

现在,有人可以解释这导致的差异吗?实际上,我在文档中找到了!

如果任一操作数是浮点值,则结果为浮点值,并且不受前述规则的影响.

Qua*_*noi 11

来自文档:

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
Run Code Online (Sandbox Code Playgroud)

基本上,随着你的演员,你告诉你MySQL如何对待0xFFFFFFFFFFFFFFFF.这是-1签名18446744073709551615时,未签名时.

  • `18446744073709551615`正好是2 ^ 64-1.我不指望任何其他输出. (7认同)