[MSSQL] Mysql BUg 5-6 = 4294967295

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [MSSQL] Mysql BUg 5-6 = 4294967295

    Bin heute bei mir auf folgendes Problem gestoßen. Ist das von MySQl so gewollt oder nicht? Denke mal nicht. Hat jemand eine Lößung oder gibts schon was von Mysql? Hab leider nichts gefunden


    Es kann jeder gern mal testen, unten findet ihr die SQL-Querys.
    Code:
    CREATE DATABASE `test`;
    USE `test`;
    CREATE TABLE `test` ( `test` int(10) unsigned NOT NULL ) ENGINE=MyISAM;
    INSERT INTO `test` (`test`) VALUES (0);
    SELECT * FROM `test`;
    UPDATE `test` SET  `test` = 0;
    SELECT * FROM `test`;
    UPDATE `test` SET  `test` =  `test`+5;
    SELECT * FROM `test`;
    UPDATE `test` SET  `test` =  `test`-6;
    SELECT * FROM `test`;
    So sieht es dann bei mir aus.
    Code:
    mysql> UPDATE `test` SET  `test` = 0;
    Query OK, 1 row affected (0.00 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    mysql> SELECT * FROM `test`;
    +------+
    | test |
    +------+
    |    0 |
    +------+
    1 row in set (0.00 sec)
    
    mysql> UPDATE `test` SET  `test` =  `test`+5;
    Query OK, 1 row affected (0.00 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    mysql> SELECT * FROM `test`;
    +------+
    | test |
    +------+
    |    5 |
    +------+
    1 row in set (0.00 sec)
    
    mysql> UPDATE `test` SET  `test` =  `test`-6;
    Query OK, 1 row affected, 1 warning (0.00 sec)
    Rows matched: 1  Changed: 1  Warnings: 1
    
    mysql> SELECT * FROM `test`;
    +------------+
    | test       |
    +------------+
    | 4294967295 |
    +------------+
    1 row in set (0.00 sec)
    http://b.mafia-inc.de/?p=498
    Mafia Browsergame - Scripts

    Wer glaubt, ein Christ zu sein, weil er die Kirche besucht, irrt sich. Man wird ja auch kein Auto, wenn man in eine Garage geht.
    Albert Schweitzer (14.01.1875 - 04.08.1965)

  • #2
    Du versuchst einen negativen (also Vorzeichenbehafteten Wert) in ein Feld zu schreiben, dass nur Zahlen ohne Vorzeichen aufnimmt. Das steht alles aber auch in dem Warning, auf das du hingewiesen wurdest.
    [FONT="Helvetica"]twitter.com/unset[/FONT]

    Shitstorm Podcast – Wöchentliches Auskotzen

    Kommentar


    • #3
      stimmt da steht ja Warnin 1

      naja hab das nun anders gelöst mit SET sql_mode = 'STRICT_TRANS_TABLES';


      http://b.mafia-inc.de/?p=499
      Mafia Browsergame - Scripts

      Wer glaubt, ein Christ zu sein, weil er die Kirche besucht, irrt sich. Man wird ja auch kein Auto, wenn man in eine Garage geht.
      Albert Schweitzer (14.01.1875 - 04.08.1965)

      Kommentar


      • #4
        Du kannst das Feld auch einfach signed machen ...
        [FONT="Helvetica"]twitter.com/unset[/FONT]

        Shitstorm Podcast – Wöchentliches Auskotzen

        Kommentar


        • #5
          Original geschrieben von unset
          Du kannst das Feld auch einfach signed machen ...
          will ich aber nicht aber hätte ich fast gemacht.

          Ich wollte dort keine Negativen Zahlen drin stehen haben.
          Mafia Browsergame - Scripts

          Wer glaubt, ein Christ zu sein, weil er die Kirche besucht, irrt sich. Man wird ja auch kein Auto, wenn man in eine Garage geht.
          Albert Schweitzer (14.01.1875 - 04.08.1965)

          Kommentar


          • #6
            Original geschrieben von garyx7de
            Ich wollte dort keine Negativen Zahlen drin stehen haben.
            Das kann MySQL ja nicht wissen. Es führt einfach aus, was du per Query verlangst und es läßt eben unter Umständen auch overflows zu. Wenn man sich dessen bewußt ist, kann man es vielleicht auch sinnvoll einsetzen. Jedenfalls ist es kein Bug. In vielen Programmiersprachen ist es genauso.

            Kommentar


            • #7
              Wie willst du diese Zahlen sinnvoll einsetzen?

              Kommentar


              • #8
                Ich will gar nicht. Aber man kann. Zum Beispiel für einen Round-Robin-Scheduler. Dank overflow kann man einfach immer addieren oder subtrahieren. Nicht schön, aber schnell.

                Kommentar


                • #9
                  Original geschrieben von onemorenerd
                  Ich will gar nicht. Aber man kann. Zum Beispiel für einen Round-Robin-Scheduler. Dank overflow kann man einfach immer addieren oder subtrahieren. Nicht schön, aber schnell.
                  schön aber wie kann ich das hier z.b. expliziet nur für int unsigned ausstellen? Ich hab jetzt einfach mal float genommen :/ damit klappts
                  Mafia Browsergame - Scripts

                  Wer glaubt, ein Christ zu sein, weil er die Kirche besucht, irrt sich. Man wird ja auch kein Auto, wenn man in eine Garage geht.
                  Albert Schweitzer (14.01.1875 - 04.08.1965)

                  Kommentar


                  • #10
                    Original geschrieben von garyx7de
                    wie kann ich das hier z.b. expliziet nur für int unsigned ausstellen?
                    Gar nicht!
                    Entweder du willst deine Spalte unsigned, dann läufts eben schon bei -1 über, oder du willst sie signed, dann läufts bei -2147483649 über.

                    Jeder Datentyp hat Grenzen, auch float. Bewege dich innerhalb der Grenzen und alles ist gut. Wenn sie dir zu eng sind ... PEBCAK.

                    Kommentar


                    • #11
                      ne da läuft es ja nicht über
                      Mafia Browsergame - Scripts

                      Wer glaubt, ein Christ zu sein, weil er die Kirche besucht, irrt sich. Man wird ja auch kein Auto, wenn man in eine Garage geht.
                      Albert Schweitzer (14.01.1875 - 04.08.1965)

                      Kommentar


                      • #12
                        Datentypen laufen immer über. Unbegrenzte Wertebereiche gibt es nur in der Theorie. In der Praxis ist der Speicher immer begrenzt.
                        Vielleicht wird es bei floats geprüft und abgelehnt. Aber afaik hängt das Verhalten nur vom SQL-Mode NO_UNSIGNED_SUBTRACTION ab und sollte doch über alle Datentypen konsistent sein.

                        Edit: Ich habe mal nachgeschaut. Andere hielten es auch schon für einen Bug, dass INT UNSIGNED Felder Dinge speichern, was bei FLOAT UNSIGNED Feldern mit "out of range" verweigert wird. Aber MySQL sagt es ist kein Bug, siehe http://bugs.mysql.com/bug.php?id=14543 ff. Es ist dokumentiertes Verhalten von MySQL. Scheinbar nicht konsistent, aber kein Fehler in der Software.

                        Kommentar

                        Lädt...
                        X