Die Typen BINARY
und
VARBINARY
ähneln CHAR
bzw. VARCHAR
. Der Unterschied besteht darin,
dass diese beiden Typen binäre (statt nichtbinärer) Strings
speichern, d. h., sie enthalten byte- statt zeichenbasierter
Strings. Diese Datentypen haben aufgrund dessen keinen
Zeichensatz: Sortierung und Vergleiche basieren in diesem Fall
auf den numerischen Werten der Bytes in den Werten.
Die zulässige Maximallänge von BINARY
und
VARBINARY
entspricht der von
CHAR
bzw. VARCHAR
, nur
wird die Länge von BINARY
und
VARBINARY
in Bytes statt in Zeichen
angegeben.
Die Datentypen BINARY
und
VARBINARY
sind nicht identisch mit den Typen
CHAR BINARY
und VARCHAR
BINARY
Bei Letzteren hat das Attribut
BINARY
nicht zur Folge, dass die Spalte als
binäre String-Spalte behandelt wird. Stattdessen aktiviert sie
die binäre Sortierung für den Spaltenzeichensatz, und die
Spalte selbst enthält nichtbinäre zeichenbasierte Strings
statt binärer bytebasierter Strings. So wird beispielsweise
CHAR(5) BINARY
als CHAR(5) CHARACTER
SET latin1 COLLATE latin1_bin
behandelt
(vorausgesetzt, der Standardzeichensatz ist
latin1
). Hier liegt ein Unterschied zu
BINARY(5)
vor, das binäre Strings mit einer
Länge von 5 Byte speichert, für die kein Zeichensatz und keine
Sortierung definiert sind.
Wenn BINARY
-Werte gespeichert werden, werden
sie nach rechts hin mit dem Füllwert auf die gewünschte Länge
aufgefüllt. Der Füllwert ist 0x00
(das
Nullbyte). Beim Einfügen werden Werte nach rechts hin mit
0x00
aufgefüllt, und beim Auswählen werden
am Ende stehende Nullbytes nicht entfernt. Alle Bytes werden in
Vergleichen (einschließlich ORDER BY
- und
DISTINCT
-Operationen) berücksichtigt.
0x00
-Bytes und Leerzeichen sind in
Vergleichen unterschiedlich, wobei 0x00
einen
kleineren Wert als das Leerzeichen hat.
Beispiel: Bei einer BINARY(3)
-Spalte wird
'a '
beim Einfügen zu
'a \0'
. 'a\0'
wird
beim Einfügen zu 'a\0\0'
. Bei der Auswahl
bleiben die gewählten Werte unverändert.
Bei VARBINARY
werden weder beim Einfügen
Füllbytes angehängt noch bei der Auswahl Bytes abgeschnitten.
Alle Bytes werden in Vergleichen (einschließlich ORDER
BY
- und DISTINCT
-Operationen)
berücksichtigt. 0x00
-Bytes und Leerzeichen
sind in Vergleichen unterschiedlich, wobei
0x00
einen kleineren Wert als das Leerzeichen
hat.
Bei solchen Fällen, in denen Füllbytes 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üllbytes 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\0'
zu speichern.
Wenn Sie den Datentyp BINARY
zur Speicherung
binärer Daten verwenden wollen und es wichtig ist, dass der
abgerufene mit dem zuvor gespeicherten Wert vollständig
identisch ist, dann sollten Sie die beschriebenen Merkmale zum
Auffüllen und Abschneiden sorgfältig lesen. Das folgende
Beispiel veranschaulicht, wie sich das Auffüllen von
BINARY
-Werten mit 0x00
auf
Vergleiche von Spaltenwerten auswirkt:
mysql>CREATE TABLE t (c BINARY(3));
Query OK, 0 rows affected (0.01 sec) mysql>INSERT INTO t SET c = 'a';
Query OK, 1 row affected (0.01 sec) mysql>SELECT HEX(c), c = 'a', c = 'a\0\0' from t;
+--------+---------+-------------+ | HEX(c) | c = 'a' | c = 'a\0\0' | +--------+---------+-------------+ | 610000 | 0 | 1 | +--------+---------+-------------+ 1 row in set (0.09 sec)
Wenn der abgerufene Wert mit dem zur Speicherung angegebenen
Wert identisch sein muss, ohne dass aufgefüllt wird, dann
sollten Sie unter Umständen besser VARBINARY
oder einen der BLOB
-Datentypen verwenden.
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.