MySQL-Bug? Uppercase-String ist FALSE ?
Froschpopo
- mysql
- sql
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
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
Tach!
Vielleicht bin ich aber auch noch nicht auf das richtige Recherche-Keyword gestoßen.
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.