Frage

Does MySQL (5.0.45) wie seltsame interne Typumwandlungen mit unsigned Mathematik zu tun? Ich bin zu speichern ganze Zahlen unsigned aber als Grundrechen Auswahl ich empörend Zahlen:

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)

Ich nehme an, dies mit der Tatsache zu tun hat, dass die Subtraktion negativ ist, und somit wird es versuchen, die Ergebnisse in ein unsigned abzubilden und überfüllt? Ich kann dies offenbar lösen, indem alles unterzeichnet zu ändern, aber ich würde einen wenig mehr positiven Raum mit meinem 32-Bit-Integer bevorzugen.

Ich habe nicht vor auf MySQL in diese laufen und ich bin mir ziemlich sicher, dass ich getan viel mit unsigned MySQL Arithmetik haben; dies ist ein häufiges Problem?

War es hilfreich?

Lösung

Wenn entweder die linke Seite oder die rechte Seite des Subtraktionsoperator nicht signiert ist, wird das Ergebnis auch nicht signiert. Sie können dies, indem Sie ändern der NO_UNSIGNED_SUBTRACTION SQL-Modus .

Alternativ können Sie auch Ihre Werte ohne Vorzeichen explizit werfen Bigint Werte unterzeichnet werden und dann die Subtraktion tun.

Andere Tipps

versuchen, diese:

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)

Referenz: http://dev.mysql.com /doc/refman/5.0/en/cast-functions.html

Ja, die Zwischen Subtraktion hat ein 64-Bit-Wraparound. Da erwartet Sie 32-Bit-Integer, aber eigentlich 64 bekommen, gibt es keinen Grund, ohne Vorzeichen zu verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top