MySQL: ABS() führt zu Überlauf

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Die Absolut Funktion "ABS()" führt zu einem Überlauf wenn unsigned ints mit signed ints vermischt werden.

    Inhaltsverzeichnis

    Testszenario

    Quellcode

    1. CREATE TABLE tabelle1 (
    2. id int(11) NOT NULL auto_increment,
    3. wert1 int(11) NOT NULL,
    4. wert2 int(11) NOT NULL,
    5. PRIMARY KEY (id)
    6. ) ENGINE=MyISAM;
    7. INSERT INTO tabelle1 (id, wert1, wert2) VALUES
    8. (1, 1, 2),
    9. (2, 2, 1);
    10. CREATE TABLE tabelle2 (
    11. id int(11) NOT NULL auto_increment,
    12. wert1 int(11) unsigned NOT NULL,
    13. wert2 int(11) unsigned NOT NULL,
    14. PRIMARY KEY (id)
    15. ) ENGINE=MyISAM;
    16. INSERT INTO tabelle2 (id, wert1, wert2) VALUES
    17. (1, 1, 2),
    18. (2, 2, 1);
    Alles anzeigen



    Query

    Quellcode

    1. SELECT ABS(a.wert1-b.wert2) FROM tabelle1 a JOIN tabelle2 b ON a.id = b.id;
    2. +----------------------+
    3. | val |
    4. +----------------------+
    5. | 18446744073709551615 |
    6. | 1 |
    7. +----------------------+
    8. 2 rows in set (0.00 sec)


    Workaround

    Quellcode

    1. SELECT IF(a.wert1>b.wert2,a.wert1-b.wert2,b.wert2-a.wert1) FROM tabelle1 a JOIN tabelle2 b ON a.id = b.id;

    7.913 mal gelesen