MyS­QL Feh­ler #1292 führt in die Irre

Neu­lich ent­deck­te ich, dass eine Tabel­le, die eigent­lich per Trig­ger regel­mä­ßig neu erzeugt wer­den soll­te, nicht mehr gene­riert wird. Das Script ist recht schlicht:

DROP TABLE IF EXISTS <tablename>;
CREATE TABLE <tablename> AS SELECT ...

Von Hand aus­ge­führt zeig­te der CREATE TABLE-Befehl fol­gen­den Fehler:

#1292 - Truncated incorrect DOUBLE value: 

Nun exis­tiert aller­dings weder in der Ziel­ta­bel­le noch in einer der Quel­len (zwei Views, die wie­der­um auf meh­re­ren Tabel­len basie­ren) irgend­ein DOUBLE-Wert. Es gibt aus­schließ­lich INT und String-Fel­der. Das gab mir zu denken.

Zudem ließ sich der SELECT-Befehl pro­blem­los und feh­ler­frei aus­füh­ren. Erst durch das CREATE TABLE ... AS ... (oder auch ein SELECT ... INTO ...) wird der Feh­ler erzeugt.

Nach eini­ger Recher­che stieß ich auf vie­le ähn­lich gela­ger­te Fäl­le. Das grund­le­gen­de Pro­blem ist wohl ein Ver­gleich zwi­schen einem nume­ri­schen und einem String-Wert in irgend­ei­nem der betei­lig­ten Views. Dafür wer­den intern wohl bei­de Wer­te in DOUBLE-Typen umge­wan­delt, was bei einem String zu einem Feh­ler führt. War­um der Feh­ler aller­dings erst beim SELECT INTO oder CREATE TABLE AS und nicht schon beim SELECT ent­steht, bleibt schleierhaft.

Es wur­de eine län­ge­re Suche. Nach gefühlt Stun­den fand ich dann fol­gen­de Bedin­gung in einem der Views:

... WHERE (`cat_address`.`closure` IS NULL
    OR `cat_address`.`closure` = '') ...

Da liegt der Hase im Pfef­fer, denn cat_address.closure ist kein String, son­dern ein TINYINT. Wer­den intern für den Ver­gleich bei­de Wer­te in DOUBLE umge­wan­delt, erzeugt das bei einem String den besag­ten Feh­ler. Dass hier mit einem lee­ren String ver­gli­chen wird, erklärt auch den schein­bar abge­schnit­te­nen Feh­ler­wert am Ende der Fehlermeldung.

Mit fol­gen­der win­zi­ger Ände­rung ist das Pro­blem behoben:

... WHERE (`cat_address`.`closure` IS NULL
        OR `cat_address`.`closure` = 0) ...

Klei­ne Ände­rung, gro­ße Wir­kung. Mit einer etwas aus­sa­ge­kräf­ti­ge­ren Feh­ler­mel­dung hät­te mir Ora­cle bzw. die MariaDB-Ent­wick­ler aller­dings viel Zeit erspart.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.

eins × 2 =