문제

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 산술로 많은 일을했다고 확신합니다. 이것이 일반적인 문제입니까?

도움이 되었습니까?

해결책

뺄셈 연산자의 왼쪽 또는 오른쪽이 서명되지 않은 경우 결과도 서명되지 않습니다. 설정하여 이것을 변경할 수 있습니다 그만큼 NO_UNSIGNED_SUBTRACTION SQL 모드.

또는 서명되지 않은 값을 명시 적으로 시전하여 큰 값에 서명 한 다음 뺄셈을 수행 할 수 있습니다.

다른 팁

이 시도:

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)

참조: http://dev.mysql.com/doc/refman/55.0/en/cast-functions.html

그렇습니다. 중간 뺄셈은 64 비트 랩 어라운드를 수행했습니다. 32 비트 정수를 예상했지만 실제로 64를 얻었으므로 서명되지 않은 사용 이유는 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top