MySQL整数无符号算术问题?

MySQL整数无符号算术问题?,mysql,integer,math,unsigned,Mysql,Integer,Math,Unsigned,MySQL(5.0.45)是否喜欢使用无符号数学进行奇怪的内部类型转换?我存储的是无符号整数,但在选择基本算术运算时,我得到了惊人的数字: mysql> create table tt ( a integer unsigned , b integer unsigned , c float ); Query OK, 0 rows affected (0.41 sec) mysql> insert into tt values (215731,216774,1.58085); Quer

MySQL(5.0.45)是否喜欢使用无符号数学进行奇怪的内部类型转换?我存储的是无符号整数,但在选择基本算术运算时,我得到了惊人的数字:

mysql> create table tt ( a integer unsigned , b integer unsigned , c float );
Query OK, 0 rows affected (0.41 sec)

mysql> insert into tt values (215731,216774,1.58085);
Query OK, 1 row affected (0.00 sec)

mysql> select a,b,c from tt;
+--------+--------+---------+
| a      | b      | c       |
+--------+--------+---------+
| 215731 | 216774 | 1.58085 |
+--------+--------+---------+
1 row in set (0.02 sec)

mysql> select (a-b)/c from tt;
+---------------------+
| (a-b)/c             |
+---------------------+
| 1.1668876878652e+19 |
+---------------------+
1 row in set (0.00 sec)

mysql> -- WHAT?
mysql> select a-b from tt;
+----------------------+
| a-b                  |
+----------------------+
| 18446744073709550573 |
+----------------------+
1 row in set (0.02 sec)
我假设这与减法是负数这一事实有关,因此它试图将结果映射为无符号和溢出的?显然,我可以通过将所有内容都更改为有符号来解决这个问题,但我更希望我的32位整数有更多的正空间


我以前在MySQL上没有遇到过这种情况,我非常确定我已经用无符号MySQL算法做了很多;这是一个常见问题吗?

如果减法运算符的左侧或右侧没有符号,则结果也没有符号。您可以通过设置来更改此设置


或者,您也可以显式地将无符号值强制转换为有符号的bigint值,然后执行减法。

是的,中间减法执行了64位环绕运算。由于您期望的是32位整数,但实际得到的却是64位整数,因此没有理由使用无符号。

尝试以下方法:

mysql> select cast(cast(a-b as unsigned) as signed)/c from tt;

+-----------------------------------------+
| cast(cast(a-b as unsigned) as signed)/c |
+-----------------------------------------+
|                       -659.771639688953 | 
+-----------------------------------------+
1 row in set (0.00 sec)

参考资料:

Duplicate:是的,想象一下我的内存图,当时我们显然能够以每秒约119万亿字节的速度维持内存分配。这就是《星际迷航》的计算。新文档链接:。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。马里亚布: