Avatar

Probleme mit den alten Tabellendefintionen von MLF1 (General)

by Alfie ⌂, Vienna, Austria, Monday, April 08, 2019, 22:23 (1842 days ago) @ Auge

Hallo Auge

Mittlerweile habe ich einige Probleme aufgespürt, die eventuell aus den etwas altertümlichen Tabellendefintionen im Zusammenspiel mit (einigermaßen) aktuellen MySQL-Versionen herrühren.

Kann gut sein. Ich denke, das Problem ist ein grundsätzliches. PHP ist schwach typisiert: Ohne vorherigige Spezifikation sind Variablen vom Typ mixed und können (!) on-the-fly umgewandelt werden. Ob das immer so funktioniert wie erwartet, ist nicht garantiert. Solange man nur innerhalb von PHP unterwegs ist, kann mich sich daran gewöhnen oder – vermutlich besser – sich selbst den Zwang auferlegen Variablen eines bestimmten Typs zu initialisieren. get_defined_vars() hat mir schon manchmal die Augen geöffnet.
Mühsam wird’s im Zusammenspiel mit einer stark typisierten Sprache wie SQL. Das ist vermutlich ein guter Teil der Schnitzeljagd die wir da betreiben.

Fehlende Default-Werte für einige Tabellenspalten moniert, […] Das gleiche Problem hatte ich nunmehr auch bei der Postingtabelle, wo bei einem neuen Posting das Feld "edited" leer bleibt aber eben auch keinen default value hat. Ist dir über die Jahre soetwas schon einmal untergekommen?

Maybe. Can’t remember. In einigen neuen Tabellen (die es bei dir nicht gibt) habe ich immer einen Default vorgegeben. Wenn nicht sinnvoll, immer NULL (auch bei varchar). Wie hat denn deine Tabelle ausgesehen? Bei mir haben last_answer und edited den Default 0000-00-00 00:00:00, NULL ist nicht erlaubt.

Für die bisher gefundenen Fälle habe ich bei den Zeitstempeln in der Eintrags- und der Benutzerdatentabelle NULL zugelassen und als Default gesetzt …

Musst du dann aber entsprechend in PHP behandeln. Aber was sag ich dir da. ;-)
Das da

<?php
 $a0 = '-0.5';
 $b0 = '+0.5';
 $a1 = $a0; settype($a1, 'integer');
 $b1 = $b0; settype($b1, 'integer');
 $a2 = $a0; settype($a2, 'float');
 $b2 = $b0; settype($b2, 'float');
 $a3 = $a2; settype($a3, 'integer');
 $b3 = $b2; settype($b3, 'integer');
 $a4 = round($a2, 0);
 $b4 = round($b2, 0);
 echo '<pre>';
 echo $a0."\n";
 echo $b0."\n\n";
 echo $a1."\n";
 echo $b1."\n\n";
 echo $a2."\n";
 echo $b2."\n\n";
 echo $a3."\n";
 echo $b3."\n\n";
 echo $a4."\n";
 echo $b4."\n";
 echo '</pre>';
?>

ist sowieso gewöhnungsbedüftig. Die kaufmännische Rundung (wie in bloody Excel, dammit!) ist einer Programmiersprache nicht würdig. Noch nie von IEEE 754 gehört?

… sowie in Falle der Spalte "title" in der Smiley-Tabelle den Default-Wert als einen leeren String ('') definiert.

Lustig. Hab ich irgendwann auch so eingerichtet.

Ich tendiere zudem dazu, so ziemlich alle Spaltendefinitionen mit NOT NULL default '' gegen NULL default NULL zu ersetzen. Wenn ein Feld keinen Wert haben sollte, sollte das dazugehörige Tabellenfeld auch tatsächlich leer sein und ncht einen Leerstring enthalten.

Ist sauberer. NULL ist NULL, basta! Ein Leerstring ist Quatsch.

Ich werde die Auswirkungen dieser Änderung mit Beispieldaten aus meinem alten Projektforum testen. Die liegen zum Glück noch in der Datenbank meiner anderen Seite.

Good luck!

--
Cheers,
Alfie (Helmut Schütz)
BEBA-Forum (v1.8β)


Complete thread:

 RSS Feed of thread