Am Wochenende sah ich mir ein Script eines anderen Programmierers an … der Webmaster des Scriptes hatte eine Frage und zur Beantwortung benötigte ich Zugang zum Script. Nach langen Erklärungen, was denn genau passieren soll und was denn aktuell wirklich passiert, stieß ich auf einige Besonderheiten im Script.
Nun, den Fehler konnte ich beseitigen und der Webbi bat mich dann gleich mal, ob ich denn mal über den Code an sich sehen könnte, “ob man da noch was rausholen kann, so, Geschwindigkeitstechnisch”. “Immer”, denke ich mir und sehe mir das ganze so.
Okay, optimal war der Code nicht, eher genau das Gegenteil. Mein Kommentar war dann, dass, wenn der Webbi das ganze schnell haben will, er sich doch bitte einen _guten_ Programmierer holen soll, der das ganze mal neu macht. Der alte Code wäre dafür nicht geeignet. Der Webbi war nachher froh, dass der alte Code das macht, was er wollte und damit ist die Geschichte erstmal beendet.
Warum schreibe ich das ganze?
Nun, im Code fiel mir auf, dass ziemlich viele Variablen gegen die Datenbank geprüft wurden, nur für den Zweck, ob in einem Datenbankfeld – sinngemäß – ja oder nein steht. Dieses ja-oder-nein wurde dann aber in einem Zahlenfeld in mySQL gespeichert – soweit, so gut – nur eben ein INT(1).
Und nun zum Sinn dieses Postings: Lieber Programmierer, du brauchst in der DB einen Platz um “ja” oder “nein” zu speichern? Dann minimiere “ja” zu 1 und “nein” zu 0, soweit kamst du ja schon. Nun noch die Auswahl des geeigneten DB-Typen und da hast du gepatzt.
Ein INT(1) speichert eben NICHT nur eine Zahl mit der Länge 1 (also 0 bis 9), sondern einen 4 Byte großen Integer Wert, den du mittels “ZEROFILL” dann auf die in den Klammern angegebene Zahl mit 0 auffüllen kannst. Habe ich ein INT(3) Feld und speichere dort die Zahl 4 rein, dann steht da 004; in ein INT(3) kann ich aber auch die Zahl 123456 schreiben und habe kein Problem damit, da ein 4-Byte INT Zahlen von 0 bis 4294967295 (UNSIGNED) oder von –2147483648 bis 2147483647 (SIGNED) speichern kann, egal was in Klammern steht.
Um Speicherplatz zu sparen nimm bitte den Datentyp TINYINT, der speichert nur 1 Byte große Zahlen, also von 0 bis 255 (UNSIGNED) oder –128 bis 127 (SIGNED).
Zur weiteren Info lies dir die folgenden beiden Links durch:
http://dev.mysql.com/doc/refman/5.1/de/numeric-types.html
http://dev.mysql.com/doc/refman/5.1/de/storage-requirements.html