MySQL整数无符号算术问题?

Jé *_*eue 5 mysql math unsigned integer

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

我认为这与减法是负的事实有关,因此它试图将结果映射到无符号和溢出?我可以通过将所有内容更改为签名来解决这个问题,但我更喜欢使用32位整数来获得更多的正空间.

我之前没有遇到过关于MySQL的问题,我很确定我已经完成了很多未签名的MySQL算法; 这是个常见的问题吗?

Jam*_*lis 7

如果减法运算符的左侧或右侧是无符号的,则结果也是无符号的.您可以通过设置改变这个NO_UNSIGNED_SUBTRACTIONSQL模式.

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