Die Typen CHAR
und VARCHAR
ähneln einander, werden aber auf unterschiedliche Weise
gespeichert und abgerufen. Weitere Unterschiede sind die
maximale Länge und die Behandlung von Leerzeichen am
String-Ende. Beim Speichern und Abrufen solcher Werte erfolgt
keine Wandlung der Groß-/Kleinschreibung.
Die Typen CHAR
und VARCHAR
werden unter Angabe einer Länge deklariert, die die maximale
Anzahl von Zeichen spezifiziert, die gespeichert werden kann. So
kann ein CHAR(30)
-Wert beispielsweise 30
Zeichen aufnehmen.
Die Länge einer CHAR
-Spalte ist auf den von
Ihnen beim Anlegen der Tabelle deklarierten Wert beschränkt.
Dieser kann zwischen 0 und 255 liegen. Wenn
CHAR
-Werte gespeichert werden, dann werden
sie nach rechts mit Leerzeichen bis auf die angegebene Länge
aufgefüllt. Beim Abrufen von CHAR
-Werten
werden die am Ende stehenden Leerzeichen dann entfernt.
Werte in VARCHAR
-Spalten sind Strings
variabler Länge. Diese kann zwischen 0 und 65.535 liegen. (Die
effektive Maximallänge einer VARCHAR
-Spalte
wird durch die maximale Datensatzgröße und den verwendeten
Zeichensatz bestimmt. Die gesamte Maximallänge liegt bei 65.532
Byte.)
Im Gegensatz zu CHAR
- werden
VARCHAR
-Werte nur mit so vielen Zeichen wie
erforderlich zuzüglich eines Bytes gespeichert, welches die
Länge angibt (bei Spalten, die mit einer Länge größer 255
deklariert sind, werden hierfür 2 Byte verwendet).
VARCHAR
-Werte werden beim Speichern nicht
aufgefüllt. Ferner werden am Ende stehende Leerzeichen
entsprechend dem SQL-Standard beim Speichern und Abrufen
beibehalten.
Wenn Sie einer CHAR
- oder
VARCHAR
-Spalte einen Wert zuweisen, der die
deklarierte Länge der Spalte überschreitet, dann wird der Wert
so weit gekürzt, bis er passend ist. Handelt es sich bei den
abgeschnittenen Zeichen nicht um Leerzeichen, dann wird eine
Warnung erzeugt. Wenn Sie den strikten SQL-Modus verwenden,
erscheint beim Abschneiden von anderen Zeichen als Leerzeichen
eine Fehlermeldung (statt einer Warnung), und der Wert wird
nicht eingefügt. Siehe auch Abschnitt 5.2.5, „Der SQL-Modus des Servers“.
Die folgende Tabelle veranschaulicht die Unterschiede zwischen
den Typen CHAR
und
VARCHAR
. Hierzu wird das jeweilige Ergebnis
der Speicherung verschiedener String-Werte in
CHAR(4)
- und
VARCHAR(4)
-Spalten angezeigt:
Wert | CHAR(4) |
Erforderlicher Speicherplatz | VARCHAR(4) |
Erforderlicher Speicherplatz |
'' |
' ' |
4 Byte | '' |
1 Byte |
'ab' |
'ab ' |
4 Byte | 'ab ' |
3 Byte |
'abcd' |
'abcd' |
4 Byte | 'abcd' |
5 Byte |
'abcdefgh' |
'abcd' |
4 Byte | 'abcd' |
5 Byte |
Beachten Sie, dass die in der letzten Zeile der Tabelle gezeigten Werte nur gelten, wenn der strikte Modus nicht verwendet wird; wird MySQL hingegen im strikten Modus ausgeführt, dann werden Werte, die die Spaltenlänge überschreiten, nicht gespeichert, und ein Fehler wird ausgegeben.
Wird ein gegebener Wert in die Spalten
CHAR(4)
und VARCHAR(4)
gespeichert, dann sind die aus den Spalten abgerufenen Werte
nicht immer identisch, weil in CHAR
-Spalten
am Ende stehende Leerzeichen beim Abrufen entfernt werden. Das
folgende Beispiel veranschaulicht diesen Unterschied:
mysql>CREATE TABLE vc (v VARCHAR(4), c CHAR(4));
Query OK, 0 rows affected (0.01 sec) mysql>INSERT INTO vc VALUES ('ab ', 'ab ');
Query OK, 1 row affected (0.00 sec) mysql>SELECT CONCAT('(', v, ')'), CONCAT('(', c, ')') FROM vc;
+---------------------+---------------------+ | CONCAT('(', v, ')') | CONCAT('(', c, ')') | +---------------------+---------------------+ | (ab ) | (ab) | +---------------------+---------------------+ 1 row in set (0.06 sec)
Werte in CHAR
- und
VARCHAR
-Spalten werden entsprechend der
zeichensatzspezifischen Sortierungsweise, die der Spalte
zugewiesen ist, sortiert und verglichen.
Beachten Sie, dass alle MySQL-Sortierungen vom Typ
PADSPACE
sind, d. h. alle
CHAR
- und VARCHAR
-Werte in
MySQL werden ohne Berücksichtigung der am Ende stehenden
Leerzeichen verglichen. Zum Beispiel:
mysql>CREATE TABLE names (myname CHAR(10), yourname VARCHAR(10));
Query OK, 0 rows affected (0.09 sec) mysql>INSERT INTO names VALUES ('Monty ', 'Monty ');
Query OK, 1 row affected (0.00 sec) mysql>SELECT myname = 'Monty ', yourname = 'Monty ' FROM names;
+--------------------+----------------------+ | myname = 'Monty ' | yourname = 'Monty ' | +--------------------+----------------------+ | 1 | 1 | +--------------------+----------------------+ 1 row in set (0.00 sec)
Dies gilt für alle MySQL-Versionen ungeachtet des gewählten SQL-Modus.
Bei solchen Fällen, in denen Leerzeichen am Ende entfernt
werden oder Vergleiche diese ignorieren, hat, wenn eine Spalte
einen Index hat, der eindeutige Werte erfordert, das Einfügen
von Werten, die sich nur durch die Anzahl am Ende stehender
Füllleerzeichen unterscheiden, eine Fehlermeldung bezüglich
einer Schlüsseldublette zur Folge. Wenn beispielsweise eine
Tabelle den Wert 'a'
enthält, wird diese
Fehlermeldung erzeugt, sobald Sie versuchen,
'a '
zu speichern.
Dies ist eine Übersetzung des MySQL-Referenzhandbuchs, das sich auf dev.mysql.com befindet. Das ursprüngliche Referenzhandbuch ist auf Englisch, und diese Übersetzung ist nicht notwendigerweise so aktuell wie die englische Ausgabe. Das vorliegende deutschsprachige Handbuch behandelt MySQL bis zur Version 5.1.