Verschiedene Systemvariablen zu Zeichensätzen und Sortierfolgen sind spezifisch für die Interaktion eines Clients mit dem Server. Einige dieser Variablen wurden bereits in früheren Abschnitten erwähnt:
Die Werte für Zeichensatz und Sortierfolge können den
Systemvariablen character_set_server
und
collation_server
entnommen werden.
Die Werte für Zeichensatz und Sortierfolge der
Standarddatenbank können den Systemvariablen
character_set_database
und
collation_database
entnommen werden.
Weitere Systemvariablen zu Zeichensätzen und Sortierfolgen betreffen die Handhabung der Daten einer Verbindung zwischen einem Client und dem Server. Jeder Client hat verbindungsspezifische Systemvariablen für Zeichensatz und Sortierfolge.
Sehen wir uns doch einmal an, was eine „Verbindung“ ist: Sie stellen eine solche her, wenn Sie sich mit dem Server verbinden. Der Client sendet SQL-Anweisungen wie etwa Abfragen über die Verbindung an den Server. Der Server beantwortet diese, indem er beispielsweise Ergebnismengen über die Verbindung an den Client zurückschickt. Dies wirft eine Reihe von Fragen zum Umgang mit Zeichensatz und Sortierfolge bei Clientverbindungen auf, die sich aber alle auf der Basis von Systemvariablen beantworten lassen:
Welchen Zeichensatz verwendet eine Anweisung, wenn sie den Client verlässt?
Der Server entnimmt der Systemvariablen
character_set_client
den Zeichensatz, in
dem sich vom Client gesendete Anweisungen befinden.
In welchen Zeichensatz sollte der Server eine Anweisung übersetzen, nachdem er sie erhalten hat?
Hierzu verwendet der Server die Systemvariablen
character_set_connection
und
collation_connection
. Er wandelt die
Anweisungen, die vom Client gesendet wurden, aus
character_set_client
in
character_set_connection
um (ausgenommen
hiervon sind String-Literale, die eine Einführung wie
_latin1
oder _utf8
aufweisen). collation_connection
ist
wichtig für Vergleiche literaler Strings. Für Vergleiche von
Strings mit Spaltenwerten ist
collation_connection
hingegen unerheblich,
da Spalten eine eigene Sortierfolge haben, die in diesem Fall
Vorrang hat.
In welchen Zeichensatz soll der Server übersetzen, bevor er Ergebnismengen oder Fehlermeldungen an den Client zurückschickt?
Die Systemvariable character_set_results
gibt den Zeichensatz an, in dem der Server Abfrageergebnisse
an den Client zurückgibt. Hierzu gehören Ergebnisdaten wie
etwa Spaltenwerte und ergebnisbezogene Metadaten wie
beispielsweise Spaltennamen.
Sie können die Einstellungen dieser Variablen optimieren oder einfach die Standardeinstellungen verwenden.
Es gibt zwei Anweisungen, die sich auf die Zeichensätze einer Verbindung auswirken:
SET NAMES 'charset_name
' SET CHARACTER SETcharset_name
SET NAMES
gibt an, welchen Zeichensatz der
Client zum Versand von SQL-Anweisungen an den Server verwendet.
SET NAMES 'cp1251'
bedeutet mithin: „Ab
jetzt haben von diesem Client eingehende Nachrichten den
Zeichensatz cp1251
“. Außerdem gibt die
Anweisung den Zeichensatz an, den der Server zum Zurücksenden der
Ergebnisse an den Client verwenden soll. (Beispielsweise legt er
fest, welcher Zeichensatz für Spaltenwerte benutzt werden soll,
wenn Sie eine SELECT
-Anweisung absetzen.)
Eine SET NAMES
'
-Anweisung ist äquivalent
zu den folgenden drei Anweisungen:
x
'
SET character_set_client =x
; SET character_set_results =x
; SET character_set_connection =x
;
Das Einstellen von character_set_connection
auf
x
setzt
collation_connection
auf die
Standardsortierfolge für x
.
SET CHARACTER SET
ähnelt SET
NAMES
, setzt Zeichensatz und Sortierfolge der Verbindung
aber auf die Werte der Datenbank. Eine SET CHARACTER SET
-Anweisung ist äquivalent
zu den folgenden drei Anweisungen:
x
SET character_set_client =x
; SET character_set_results =x
; SET collation_connection = @@collation_database;
Wenn Sie collation_connection
einstellen,
setzen Sie damit gleichzeitig
character_set_connection
auf den Zeichensatz,
der mit dieser Sortierfolge verknüpft ist.
Wenn ein Client eine Verbindung herstellt, sendet er den Namen des
Zeichensatzes, den er verwenden will, an den Server. Der Server
stellt auf der Basis dieses Namens die Systemvariablen
character_set_client
,
character_set_results
und
character_set_connection
ein. Im Endeffekt
führt der Server eine SET NAMES
-Operation
unter Verwendung des Zeichensatznamens aus.
Beim mysql-Client ist die Ausführung von
SET NAMES
bei jedem Systemstart nicht
notwendig, wenn Sie einen anderen als den Standardzeichensatz
verwenden wollen. Fügen Sie der
mysql-Anweisungszeile oder Ihrer Optionsdatei
einfach die Option --default-character-set
hinzu.
Die folgende Option beispielsweise setzt die drei
Zeichensatzvariablen bei jedem Aufruf von mysql
auf koi8r
:
[mysql] default-character-set=koi8r
Beispiel: Nehmen wir an, column1
sei als
CHAR(5) CHARACTER SET latin2
definiert. Wenn
Sie SET NAMES
oder SET CHARACTER
SET
nicht angeben, dann sendet der Server bei
SELECT column1 FROM t
alle Werte für
column1
zurück und verwendet dazu den
Zeichensatz, den der Client bei der Verbindungsherstellung
angegeben hat. Im Gegensatz dazu konvertiert, wenn Sie
SET NAMES 'latin1'
oder SET CHARACTER
SET latin1
vor dem Absetzen der
SELECT
-Anweisung angeben, der Server die
latin2
-Werte in latin1
,
bevor er die Ergebnisse zurückschickt. Die Konvertierung kann
verlustbehaftet sein, wenn Zeichen verwendet werden, die nicht in
beiden Zeichensätzen vorhanden sind.
Wenn Sie nicht wollen, dass der Server Ergebnismengen konvertiert,
dann setzen Sie character_set_results
auf
NULL
:
SET character_set_results = NULL;
Hinweis: Derzeit kann UCS-2 nicht
als Clientzeichensatz verwendet werden, d. h., SET NAMES
'ucs2'
funktioniert nicht.
Um die Werte der Zeichensatz- und Sortierfolgevariablen anzuzeigen, die für Ihre Verbindung gelten, verwenden Sie die folgenden Anweisungen:
SHOW VARIABLES LIKE 'character_set%'; SHOW VARIABLES LIKE 'collation%';
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.