Der Typ »VARCHAR« in SQL (MySQL)
Zur Vereinfachung wurde bisher immer »VARCHAR ( 255 )« als Typ verwendet. Nun erweitern wir unsere Kenntnisse über mögliche Typen etwas.
»VARCHAR ( Länge )«
Dieser Typ umfaßt Texte mit maximal der in den Klammern angegebenen Zahl von Zeichen und wurde bisher immer – auch für Zahlen – verwendet. In den Klammern kann aber auch eine andere Zahl stehen, die nicht zu groß sein darf. (Die genauen Obergrenzen hängen von verschiedenen Umständen ab.)
Unter einem VARCHAR-Typen verstehen wir im folgenden einen Typ, dessen Bezeichnung mit »VARCHAR (« beginnnt.
»VARCHAR ( 255 )«
In diesem Kurs wurde bisher »VARCHAR ( 255 )« als Typ verwendet, weil eine Spalte dieses Typs die meisten Arten von Informationen aufnehmen kann (also auch Numeralia für Zahlen) und einige Versionen von MySQL nur Werte bis »255« zuließen, diese Einschränkung besteht inzwischen aber wohl nicht mehr.
Die Obergrenze für die angegebene Länge
Die in den Klammern angegebene Länge kann zwischen 0 und 65535 liegen, aber unter bestimmten Umständen kann sie in Abhängigkeit von der Zeichencodierung und Begrenzungen der Größe einer Zeile auch noch weiteren Beschränkungen unterworfen sein. Ein Wert von »255« sollte allerdings meist möglich sein.
Zu weiteren Details beachte man das MySQL-Handbuch, etwa »dev.mysql.com/doc/en/char.html«.
Das Einfügen längerer Texte
Wenn versucht wird, Texte einzufügen, die länger als die Obergrenze sind, wird eine Warnung erzeugt und nur die Textanfänge gespeichert, die noch in das Feld passen.
main.sql
WARNINGS; SET sql_mode = '';
DROP SCHEMA S; CREATE SCHEMA S; USE S;CREATE TABLE BUCHUNG ( BEZEICHNUNG VARCHAR ( 5 ) );
INSERT INTO BUCHUNG ( BEZEICHNUNG ) VALUES ( 'ZAHLUNGSEINGANG' );
SELECT * FROM BUCHUNG;
- Protokoll
Warning (Code 1265): Data truncated for column 'BEZEICHNUNG' at row 1
+-------------+
| BEZEICHNUNG |
+-------------+
| ZAHLU |
+-------------+
Der strenge Modus
Durch »SET sql_mode = 'STRICT_ALL_TABLES';« wird der sogenannten „strenge Modus“ für alle Tabellen aktiviert. In diesem Modus wird die Einhaltung einiger Regeln etwas strenger überprüft.
Die Verwendung von »SET sql_mode = 'ANSI,TRADITIONAL';« (genauer: von »SET sql_mode = 'TRADITIONAL';«) umfaßt bereits die Wirkung von »SET sql_mode = 'STRICT_ALL_TABLES';«, da »TRADITIONAL« »STRICT_ALL_TABLES« umfaßt. Der Genauigkeit halber verwenden wir in dieser Lektion oft das speziellere »SET sql_mode = 'STRICT_ALL_TABLES';«.
Das Einfügen längerer Text im strengen Modus
Wenn versucht wird, Texte einzufügen, die länger als die Obergrenze sind, wird im strengen Modus eine Fehlermeldung erzeugt und nichts eingefügt.
main.sql
WARNINGS; SET sql_mode = 'STRICT_ALL_TABLES';
DROP SCHEMA S; CREATE SCHEMA S; USE S;CREATE TABLE BUCHUNG ( BEZEICHNUNG VARCHAR ( 5 ) );
INSERT INTO BUCHUNG ( BEZEICHNUNG ) VALUES ( 'ZAHLUNGSEINGANG' );
SELECT * FROM BUCHUNG;
- Protokoll
ERROR 1406 (22001) at line 6 in file: 'F:\r\j\autocomp\main.sql': Data too long for column 'BEZEICHNUNG' at row 1
Groß- und Kleinschreibung
Die Groß- und Kleinschreibung ist bei Datentypen in MySQL nicht signifikant. Das heißt, daß »VARCHAR ( 255 )« dieselbe Bedeutung hat wie »Varchar ( 255 )« oder »varchar ( 255 )«. Wir verwenden in diese Kurs an von nun an manchmal auch Kleinschreibung (wie »double«) bei Datentypen, weil dies von MySQL bei Verwendung des später in diesem Kurs vorgestellten Kommandos »EXPLAIN« (»DESCRIBE«) selber so ausgegeben wird. Andererseits verwendet die offizielle Dokumentation sowohl von MySQL (wie beispielsweise »http://dev.mysql.com/doc/refman/5.5/en/floating-point-types.html«) wie auch von Standard-SQL Großschreibung (wie »DOUBLE«). Daher kann man die Großschreibung im Zweifel bevorzugen.
Wahl einer guten Länge
Aus Sicht der Datenmodellierung sollte für Texte, die ihrer Natur entsprechend nicht in der Länge beschränkt sind, hier eigentlich ein riesiger Wert, wie »999« oder gar »9999« verwendet werden, auch wenn die meisten Texte viel kürzer sind. Beispielsweise umfassen die meisten Namen von Städten nur zirka ein Dutzend Zeichen, aber es gibt prinzipiell keinen Grund, der es ausschließt, daß irgendeine Stadt einen Namen mit Tausenden von Zeichen hat. Es gibt aber technische Begrenzungen, die es hier verlangen, einen nicht zu großen Wert zu wählen, so daß man im Falle von Städtenamen dann als Kompromiß »255« wählen könnte. Dies ist für alle bekannten Städte ausreichend groß, und falls einmal eine Stadt mit einem Namen vorkommen sollte, der mehr als 255 Zeichen umfaßt, so wird es für diesen Namen wahrscheinliche eine gängige Abkürzung geben, die meistens verwendet wird, und dann auch in der Datenbank Verwendung finden könnte.
Falls keine genaue Obergrenze eines Wertebereichs erkannt werden kann, sollte diese sehr großzügig bemessen werden, damit der Wertebereich auch bei Ausreißern mit absurden (aber möglichen oder denkbaren) Werten noch ausreicht. Beispielsweise ist es nicht zu erkennen, wie lang der Name einer Person maximal sein kann. Daher sollte die Länge eines Feld für Personennamen in einer Datenbank sehr großzügig bemessen werden, damit auch außergewöhnlich lange Namen erfaßt werden können.
Personennamen
Auf Hawaii hatten Führerscheine beispielsweise 35 Zeichen für den gesamten Namen. In der Presse wurde von einer Frau Keihanaikukauakahihuliheekahaunaele aus Hawaii berichtet, deren Nachname alleine bereits 36 Zeichen umfaßte. Das System wurde daraufhin so umgestellt, daß 40 Zeichen für den Vornamen, 35 für den Mittelnamen und 40 für den Nachnamen möglich sind. Der Aufwand für die Umstellung wäre vielleicht nicht nötig gewesen, wenn das System von Anfang an ausreichend großzügig bemessen worden wäre.
Von einem noch längeren Namen berichtet: »en.wikipedia.org/wiki/Hubert_Blaine_Wolfeschlegelsteinhausenbergerdorff,_Sr.« oder »http://www.historyrundown.com/top-5-people-with-the-longest-names/«.
Zu beachten ist ferner, daß Personennamen weltweit nicht unbedingt immer so zerlegt werden können (etwa in einen Vornamen und Nachnamen), wie dies bei den klassischen deutschen Namen der Fall ist. Daher könnte es schon zu Problemen führen, wenn in einer Datenbank für Personen Spalten für den Vornamen und Nachnamen vorgesehen werden, nur weil diese Zerlegung in unserer Kultur immer so üblich ist. Ein Vertiefung dieses Themas würde hier aber sicher zu weit führen.
VARCHAR-Literale
Zeichenfolgenliterale haben den Typ »VARCHAR«.
'A' VARCHAR (1)
'ABC' VARCHAR (3)
Das folgende Transkript zeigt die Verwendung von VARCHAR-Literalen in einfachen Abfragen.
- Konsole
SELECT 'A';
+---+
| A |
+---+
| A |
+---+SELECT 'ABC';
+-----+
| ABC |
+-----+
| ABC |
+-----+