Ein BLOB
ist ein binäres großes Objekt,
welches eine variable Menge von Daten aufnehmen kann. Die vier
BLOB
-Typen sind TINYBLOB
,
BLOB
, MEDIUMBLOB
und
LONGBLOB
. Sie unterscheiden sich lediglich in
der maximalen Länge der Werte, die sie aufnehmen können. Die
vier TEXT
-Typen sind
TINYTEXT
, TEXT
,
MEDIUMTEXT
und LONGTEXT
.
Sie entsprechen den vier BLOB
-Typen, d. h.,
sie haben dieselben Längenbeschränkungen und
Speicheranforderungen. Siehe auch
Abschnitt 11.5, „Speicherbedarf von Spaltentypen“. Beim Speichern und
Abrufen von TEXT
- und
BLOB
-Spalten erfolgt keine Wandlung der
Groß-/Kleinschreibung.
BLOB
-Spalten werden als binäre Strings
(Byte-Strings) behandelt, TEXT
-Spalten als
nichtbinäre Strings (zeichenbasierte Strings).
BLOB
-Spalten haben keinen Zeichensatz, und
die Sortierung basiert auf den numerischen Werten der Bytes in
den Spaltenwerten; TEXT
-Spalten hingegen
haben einen Zeichensatz, dessen Sortierung auch bestimmt, wie
die Werte sortiert und verglichen werden.
Wird eine TEXT
-Spalte indiziert, dann werden
Vergleiche von Indexeinträgen am Ende mit Leerzeichen
aufgefüllt. Das bedeutet, dass, wenn der Index eindeutige Werte
erfordert, Fehlermeldungen zu doppelt vorhandenen Schlüsseln
auftreten werden, wenn sich Werte lediglich in der Anzahl der am
Ende stehenden Leerzeichen unterscheiden. Wenn beispielsweise
eine Tabelle den Wert 'a'
enthält, wird
diese Fehlermeldung erzeugt, sobald Sie versuchen,
'a '
zu speichern. Für
BLOB
-Spalten trifft dies allerdings nicht zu.
Wenn Sie im strikten Modus einer BLOB
- oder
TEXT
-Spalte einen Wert zuweisen, der die
zulässige Länge des Datentyps ü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 stattdessen eine Fehlermeldung, und der Wert wird
nicht eingefügt. Siehe auch Abschnitt 5.2.5, „Der SQL-Modus des Servers“.
In vielerlei Hinsicht können Sie eine
BLOB
-Spalte als
VARBINARY
-Spalte betrachten, die beliebig
groß sein kann. Ähnlich können Sie eine
TEXT
-Spalte auch als
VARCHAR
-Spalte betrachten.
BLOB
und TEXT
unterscheiden sich wie folgt von VARBINARY
bzw. VARCHAR
:
Bei Indizes in BLOB
- und
TEXT
-Spalten müssen Sie eine Länge für
das Indexpräfix angeben. Bei CHAR
und
VARCHAR
ist die Präfixlänge optional.
Siehe auch Abschnitt 7.4.3, „Spaltenindizes“.
LONG
und LONG VARCHAR
lassen sich dem Datentyp MEDIUMTEXT
zuordnen.
Grund hierfür sind Kompatibilitätsaspekte. Wenn Sie das
Attribut BINARY
mit einem
TEXT
-Datentyp verwenden, wird der Spalte die
binäre Sortierung des Spaltenzeichensatzes zugewiesen.
MySQL Connector/ODBC definiert BLOB
-Werte als
LONGVARBINARY
und
TEXT
-Werte als
LONGVARCHAR
-Werte.
Da BLOB
- und TEXT
-Werte
sehr lang sein können, können Sie bei ihrer Verwendung auf
einige Einschränkungen treffen:
Nur die ersten max_sort_length
Bytes der
Spalte werden zur Sortierung verwendet. Der Standardwert von
max_sort_length
beträgt 1024. Dieser
Wert kann mithilfe der Option
--max_sort_length=
beim Start des mysqld-Servers geändert
werden. Siehe auch
Abschnitt 5.2.2, „Server-Systemvariablen“.
N
Sie können die Berücksichtigung von mehr Bytes bei der
Sortierung oder Gruppierung implementieren, indem Sie den
Wert von max_sort_length
zur Laufzeit
erhöhen. Jeder Client kann den Wert für seine
Sitzungsvariable max_sort_length
selbst
ändern:
mysql>SET max_sort_length = 2000;
mysql>SELECT id, comment FROM t
->ORDER BY comment;
Eine andere Möglichkeit, GROUP BY
oder
ORDER BY
für eine
BLOB
- oder
TEXT
-Spalte, die lange Werte enthält, zu
verwenden und dabei mehr als die mit
max_sort_length
angegebene Anzahl von
Bytes zu berücksichtigen, besteht darin, den Spaltenwert in
ein Objekt fester Länge zu konvertieren. Standardmäßig
erfolgt eine solche Konvertierung mit der Funktion
SUBSTRING
. Die folgende Anweisung
beispielsweise hat die Berücksichtigung von 2000 Byte in
der Spalte comment
für die Sortierung
zur Folge:
mysql>SELECT id, SUBSTRING(comment,1,2000) FROM t
->ORDER BY SUBSTRING(comment,1,2000);
Die maximale Größe eines BLOB
- oder
TEXT
-Objekts ist durch seinen Typ
bestimmt. Der größte Wert jedoch, den Sie tatsächlich
zwischen Client und Server übertragen können, wird durch
die Menge des verfügbaren Speichers und die Größe der
Kommunikationspuffer festgelegt. Sie können die Größe des
Meldungspuffers ändern, indem Sie der Variablen
max_allowed_packet
einen anderen Wert
zuweisen. Dies muss allerdings sowohl für den Server als
auch für Ihr Clientprogramm erfolgen. So können Sie etwa
sowohl mit mysql als auch mit
mysqldump den
max_allowed_packet
-Wert auf der
Clientseite verändern. Siehe auch
Abschnitt 7.5.2, „Serverparameter feineinstellen“, Abschnitt 8.5, „mysql — Das MySQL-Befehlszeilenwerkzeug mysql“
und Abschnitt 8.10, „mysqldump — Programm zur Datensicherung“.
Jeder BLOB
- und TEXT
-Wert
wird intern durch ein separat reserviertes Objekt dargestellt.
Dies steht im Gegensatz zu allen anderen Datentypen, für die
der Speicherplatz pro Spalte genau einmal beim Öffnen der
Tabelle reserviert wird.
In manchen Fällen kann es wünschenswert sein, Binärdaten wie
Mediendateien in BLOB
- oder
TEXT
-Spalten zu speichern. Beim Umgang mit
solchen Daten können sich die MySQL-Funktionen zur
String-Verarbeitung als recht praktisch erweisen. Siehe auch
Abschnitt 12.3, „String-Funktionen“. Aus Sicherheits- und anderen
Gründen empfiehlt es sich in der Regel, dies im Anwendungscode
zu tun, statt Benutzern der Anwendung die Berechtigung
FILE
zu gewähren. Details zu Sprachen und
Plattformen können Sie in den MySQL-Foren
(http://forums.mysql.com/) diskutieren.
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.