Metadaten sind „Daten über
Daten“. Alle Daten, die die Datenbank
beschreiben – nicht aber solche, die in der
Datenbank enthalten sind – bezeichnet man
als Metadaten. Insofern sind etwa Spalten-, Datenbank-, Benutzer-
und Versionsnamen sowie die meisten String-Ergebnisse aus
SHOW
-Anweisungen Metadaten. Dies gilt auch für
die Inhalte von Tabellen in INFORMATION_SCHEMA
,
weil diese Tabellen per Definition Informationen zu
Datenbankobjekten enthalten.
Die Darstellung von Metadaten muss den folgenden Anforderungen genügen:
Alle Metadaten müssen im selben Zeichensatz stehen.
Andernfalls würden weder die SHOW
-Befehle
noch SELECT
-Anweisungen für Tabellen im
INFORMATION_SCHEMA
korrekt arbeiten, weil
verschiedene Datensätze in derselben Spalte der Ergebnisse
für diese Operationen in verschiedenen Zeichensätzen stehen
würden.
Metadaten müssen alle Zeichen in allen Sprachen enthalten. Andernfalls könnten Benutzer unter Umständen Spalten und Tabellen nicht in ihrer eigenen Sprache benennen.
Um beide Bedingungen zu erfüllen, speichert MySQL Metadaten in einem Unicode-Zeichensatz (nämlich UTF-8). Dies sorgt keinesfalls für Probleme, wenn Sie keine Buchstaben mit Akzent oder nichtlateinische Zeichen verwenden. Andernfalls aber sollten Sie berücksichtigen, dass Metadaten in UTF-8 stehen.
Die Anforderungen an Metadaten sehen vor, dass die Rückgabewerte
der Funktionen USER()
,
CURRENT_USER()
, DATABASE()
und VERSION()
standardmäßig den
UTF-8-Zeichensatz verwenden; dies gilt auch für Synonyme wie
SESSION_USER()
und
SYSTEM_USER()
.
Der Server setzt die Systemvariable
character_set_system
auf den Namen des
Metadaten-Zeichensatzes:
mysql> SHOW VARIABLES LIKE 'character_set_system';
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| character_set_system | utf8 |
+----------------------+-------+
Die Speicherung von Metadaten unter Verwendung von Unicode hat
nicht zur Folge, dass der Server
Spaltenüberschriften und die Ergebnisse von
DESCRIBE
-Funktionen standardmäßig im durch
character_set_system
angegebenen Zeichensatz
zurückgibt. Wenn Sie SELECT column1 FROM t
verwenden, wird der Name column1
selbst vom
Server an den Client in dem Zeichensatz zurückgegeben, der vom
Wert der Systemvariablen character_set_results
angegeben wird (deren Standartwert ist latin1
).
Wenn Sie wollen, dass der Server Metadatenergebnisse in einem
anderen Zeichensatz zurückgibt, erzwingen Sie mit der
SET NAMES
-Anweisung eine
Zeichensatzkonvertierung am Server. SET NAMES
stellt character_set_results
und andere
zugehörige Systemvariablen um. (Siehe auch
Abschnitt 10.4, „Verbindungszeichensatz und -sortierfolge“.) Alternativ kann ein
Clientprogramm die Konvertierung nach Empfang des Ergebnisses vom
Server vornehmen. Die Konvertierung durch den Client ist
effizienter, aber diese Option ist nicht immer verfügbar.
Wenn character_set_results
den Wert
NULL
hat, wird keine Konvertierung
durchgeführt und der Server gibt Metadaten im ursprünglichen
(d. h. dem durch character_set_system
angegebenen) Zeichensatz zurück.
Fehlermeldungen, die der Server an den Client zurückgibt, werden wie Metadaten automatisch in den Zeichensatz des Clients konvertiert.
Keine Sorge, wenn Sie (beispielsweise) die Funktion
USER()
für einen Vergleich oder eine Zuordnung
innerhalb einer einzelnen Anweisung verwenden: MySQL führt die
Konvertierung für Sie automatisch durch.
SELECT * FROM Table1 WHERE USER() = latin1_column;
Dies funktioniert, weil der Inhalt von
latin1_column
vor dem Vergleich automatisch in
UTF-8 konvertiert wird.
INSERT INTO Table1 (latin1_column) SELECT USER();
Dies funktioniert, weil der Inhalt von USER()
vor der Zuweisung automatisch in latin1
konvertiert wird. Die automatische Konvertierung ist noch nicht
vollständig implementiert, sollte aber in einer zukünftigen
Version korrekt arbeiten.
Zwar ist die automatische Konvertierung nicht Bestandteil des SQL-Standards, aber das SQL-Standarddokument besagt, dass jeder Zeichensatz (hinsichtlich der unterstützten Zeichen) eine „Teilmenge“ von Unicode ist. Aufgrund des bekannten Prinzips „Was für eine übergeordnete Menge gilt, kann auch für eine Teilmenge gelten“ nehmen wir an, dass eine Sortierfolge für Unicode auch für Vergleiche mit Nicht-Unicode-Strings gelten kann.
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.