Wann passt welcher Datentyp?

Hallo,

ich bin dabei, ein Fallbeispiel aus einem SQL-Lehrbuch in PostgreSQL 8.4 einzurichten, damit ich eine Datenbank zum Herumspielen habe. Dabei kommen mir die im Buch gewählten Datentypen in einigen Fällen arg seltsam vor:

  1. Numerische Datentypen für Werte, mit denen nicht gerechnet werden kann und die mit ‘0’ anfangen können: decimal(5,0) für Postleitzahlen und decimal(20,0) für Telefonnummern.

  2. Spalten für verschiedene ganzzahlige, eher kleine Werte mit Datentyp decimal(x,0), verschiedene Werte von x.

Für beides die gleiche Frage: wozu soll das gut sein? Warum nicht integer, evtl. smallint im Fall 2, char(5) für die Postleitzahlen und char(20), evtl. auch varchar, für Telefonnummern? Von ausländischen Adressen mal völlig abgesehen, die kommen im Fallbeispiel nicht vor.

Übersehe ich da etwas oder zeigt schon diese Frage, dass mein Respekt vor Lehrbüchern einfach zu groß ist?

Nein, ja.

Andreas

Was für ein sogenanntes Lehrbuch ist denn das?

Unabhängig von dem Lehrbuch:
CHAR() ist fast immer die falsche Wahl. Hier werden die Werte immer auf eine feste Länge gebracht (durch auffüllen mit Leerzeichen. Aus ‘A’ wird also z.B. 'A ')

Wenn die tatsächlichen Werte (die in die DB geschrieben werden) unterschiedliche Längen haben, ist VARCHAR eigentlich immer die bessere Wahl.

Nur wenn Du 100% sicher bist, dass die Werte nie eine andere Länge annehmen (z.B. ISO Codes, deutsche(!) Postleitzahlen oder ähnliches) dann kann man auch CHAR nehmen.

Das Lehrbuch selber finde ich gar nicht so schlecht (Daniel Warner, Advanced SQL, Franzis - nicht unbedingt mein Lieblingsverlag), es beschreibt den Standard und nicht ein RDBMS, es drückt sich in weiten Teilen schön mathematisch aus und ist nicht so grässlich “praxisorientiert”. Nur das Fallbeispiel ist nicht in jeder Hinsicht durchdacht - und im übrigen gibt es auch auf der beiliegenden CD kein verwendbares SQL-Skript zum Einrichten, sondern verteilte Bruchstücke innerhalb einer PDF-Datei, die man nur mit schlimmen Verrenkungen in eine Textdatei bringt. Cut and Paste ergibt nichts Lesbares.

Der Unterschied ist mir klar. Bei der kürzeren Spalte geht es genau um deutsche Postleitzahlen (und nur um ein Beispiel - im wirklichen Leben hat man dann doch nach fünf Minuten die erste ausländische Adresse). Irgendwo brauche ich ein CHAR-Feld zum Probieren, unter Linux mit UTF-8 als System-Zeichensatz und als Zeichensatz der Datenbank. Mit Firebird hat mir das Probleme gemacht.