Froschpopo: MySQL-Bug? Uppercase-String ist FALSE ?

Hey Forum,

ich habe hier mal ein kleines Logik-Problem. Vielleicht bin ich aber auch noch nicht auf das richtige Recherche-Keyword gestoßen.

Folgendes:

Testfeld VARCHAR(100) NULL

Testfeld: USUSSHDGIASGDAGDA

Hier nun eine Abfrage: SELECT Testfeld FROM Tabelle WHERE Testfeld = False

Ergebnis: USUSSHDGIASGDAGDA

Das funktioniert nur mit Großbuchstaben.

WARUM?

Liebe Grüße

  1. Hallo Froschpopo,

    Vielleicht bin ich aber auch noch nicht auf das richtige Recherche-Keyword gestoßen.

    Die richtigen Keywords wären type conversion rules mysql gewesen ;-)

    Testfeld VARCHAR(100) NULL

    Testfeld: USUSSHDGIASGDAGDA

    Hier nun eine Abfrage: SELECT Testfeld FROM Tabelle WHERE Testfeld = False

    Ergebnis: USUSSHDGIASGDAGDA

    Hehe, ja, MySQL mal wieder.

    Das funktioniert nur mit Großbuchstaben.

    Nein, das geht auch mit Kleinbuchstaben:

    MariaDB [test]> select 'a' = false;
    +-------------+
    | 'a' = false |
    +-------------+
    |           1 |
    +-------------+
    1 row in set, 1 warning (0.00 sec)
    

    WARUM?

    Der Grund liegt in diesem Satz auf der Conversion Rules-Seite:

    In all other cases, the arguments are compared as floating-point (real) numbers.

    Keiner der vorher erwähnten Fälle trifft zu, also konvertiert MySQL alles nach Real und vergleicht dann. Und das ist:

    MariaDB [test]> select cast('USUSSHDGIASGDAGDA' as double);
    +-------------------------------------+
    | cast('USUSSHDGIASGDAGDA' as double) |
    +-------------------------------------+
    |                                   0 |
    +-------------------------------------+
    1 row in set, 1 warning (0.00 sec)
    
    MariaDB [test]> select cast(false as double);
    +-----------------------+
    | cast(false as double) |
    +-----------------------+
    |                     0 |
    +-----------------------+
    1 row in set (0.00 sec)
    

    Du hast dort also effektiv WHERE 0 = 0 stehen. Und ja, das ist bescheuert.

    LG,
    CK

  2. Tach!

    Vielleicht bin ich aber auch noch nicht auf das richtige Recherche-Keyword gestoßen.

    Automatische Typumwandlung

    Testfeld: USUSSHDGIASGDAGDA

    Hier nun eine Abfrage: SELECT Testfeld FROM Tabelle WHERE Testfeld = False

    Ergebnis: USUSSHDGIASGDAGDA

    Das funktioniert nur mit Großbuchstaben.

    Nein, auch mit anderen (aber nicht allen) Werten muss es so gehen.

    WARUM?

    True und False gibt es eigentlich nicht, sie sind nur Aliases für 1 und 0.

    Vom obigen Link trifft diese Regel zu: "In all other cases, the arguments are compared as floating-point (real) numbers."

    Wenn Strings mit Ziffern beginnen, werden diese als Zahl interpretiert, ansonsten ergibt die Konvertierung in eine Zahl 0. Und 0 ist gleich 0 (False).

    dedlfix.