Kurzer SQL WTF von heute:
QUOTE:mysql> SELECT 'a'='b';
0
mysql> SELECT 'a'='b'='c';
1
Warum ist das so?
Im MySQL Sourcecode ist in sql/sql_yacc.yy definiert:
QUOTE:%left EQ EQUAL_SYM GE GT_SYM LE LT NE IS LIKE REGEXP IN_SYM
Damit ist der Operator EQ (das Vergleichheitszeichen) als links-assoziativ definiert. Vergleiche von Vergleichen sind also zugelassen, 1 = 2 = 3 ist also ein zulässiges Konstrukt und es wird als ( 1 = 2 ) = 3 evaluiert. Statt links-assoziativ könnte es auch als rechts-assoziativ ( 1 = (2 = 3 )) oder als nicht-assoziativ (ein Mehrfachvergleich ist unzulässig) definiert sein.
Daher ist der boolsche Ausdruck 'a' = 'b' offensichtlich falsch, also 0. Und damit wird "0 = 'c'" zu einem Vergleich eines Integers links mit einem Character rechts. In einem links-assoziativen Ausdruck bestimmt der linke Ausdruck den Typ, zu dem der …
[Mehr]