A
Hallo,
PvdB schrieb:
Was genau muss ich ändern. Schon wäre es, wenn ich auf einen Datenbankserver gewöhnliche Datenbanken haben kann oder auch eine Datenbank die komplett auf UTF8 umgestellt ist. Oder muss der ganze DB Server dann UTF8 umgestellt werden? Im phpmyadmin konnte ich keine Funktionalität finden um Tabellen oder Datenbanken auf UTF8 umzustellen.
Ich hab mir wieder die Dokumentation von MySQL über Zeichensätze und Kollationen durchgelesen, um mein Wissen darüber wieder aufzufrischen und sicher zu gehen, dass ich weiß wovon ich spreche. Meine Behauptung über die Einstellungsmöglichkeiten waren zwar nicht inkorrekt, aber ein bisschen unvollständig. In MySQL kann man also auf insgesamt 6 Ebenen Zeichensätze (fortan ZS) und Kollationen angeben, und zwar auf:
Serverebene
Datenbankebene
Tabellenebene
Spaltenebene
(Die 5. und 6. Ebene haben nur in der Kommunikation zwischen MySQL und dem Client eine Bedeutung.)
Verbingungsebene
Ebene der Queries
In welcher Kodierung deine Daten gespeichert werden, wird nur von der Spaltenebene bestimmt. Man kann also mehrere Spalten mit unterschiedlichen Kodierungen in der selben Tabelle haben. Die Ebenen darüber spielen diesbezüglich nur in der Vererbung der Zeichensätze eine Rolle, falls man keinen ZS explizit definiert hat.
Generell ausgedrückt: Wenn man bei der Erstellung einer Datenbank/Tabelle/Spalte keinen ZS angibt, dann wird der ZS in der jeweils darüberliegenden Ebene herangezogen um den ZS in der darunterliegenden Ebene zu bestimmen. Zum Beispiel: Füge ich eine neue Spalte zu einer Tabelle hinzu und definiere aber nicht explizit einen ZS, dann wird automatisch der ZS der Tabelle geerbt.
Was Kollationen sind, bedarf einer kleinen Erklärung. Zeichensätze sind ja nichts weiter als eine "Zuweisungstabelle", in der jedes Zeichen ein Paar mit einem eindeutigen, binären Code bildet (einfaches Bsp.: A=0, B=1, C=2 etc.). In der Computerwelt wollen wir ja nicht nur Buchstaben, Symbole und Zahlen sehen können, sondern interessieren uns meistens auch für Suchmaschinen und alphabetisch sortierte Listen. Für diesen Zweck gibt es Kollationen, die sprachenabhängige Regeln bei Stringvergleichsoperationen (größer, kleiner, gleich, nicht gleich; case sensitive od. case insensitive) definieren.
Der Grund warum du in phpMyAdmin den Zeichensatz nicht direkt bestimmen kannst, ist weil dies indirekt durch die Zuweisung einer Kollation geschieht. Kollationen hängen eng mit ihrem zugehörigen Zeichensatz zusammen, weshalb sie den Zeichensatznamen als Präfix in ihrem eigenen Namen tragen und nicht mit fremden Zeichensätzen kombiniert werden dürfen. Zum Beispiel: Zeichensatz = utf8, Kollation = utf8_bin, utf8_czech_ci,utf8_danish_ci etc. Wenn du also in phpMyAdmin eine Kollation wählst, dann ist implizit klar welcher Zeichensatz verwendet werden soll. Für jede Ebene (1,2,3 und 4) gilt, dass ein Zeichensatz und eine Kollation definiert sein muss, sie sind somit niemals NULL oder undefiniert. Nicht verwirrt sein: wenn du eine Tabelle erstellst und keinen ZS angibst, dann verstößt du nicht gegen diese Regel, es wird ja nämlich im Hintergrund die Vererbungsregel - wie oben bereits erläutert - angewandt.
Dein erster Schritt ist nun, dass du eine Datenbank mit der Kollation utf8_general_ci anlegst. Ich gehe davon aus, dass du das über die Hauptseite von phpMyAdmin ohne Schwierigkeiten hinkriegst. Falls eine Datenbank bereits besteht, dann kannst du die Kollation über den "Operations"-Bereich ändern. Diese Änderung wird sich allerdings nicht auf die Tabellen und Spalten darin auswirken, da diese Ebenen ihre Kollationen bereits geerbt/zugewiesen bekommen haben, was nur einmal geschieht.
Soviel mal dazu. Als nächstes musst du dich um die Kommunikation zwischen deiner Anwendung und dem MySQL-Server kümmern. Bei all dieser Einstellungsfreudigkeit hinsichtlich der Zeichensätze und Kollationen stellt sich die Frage: In welcher Kodierung muss nun der Datenaustausch zwischen Client und Server erfolgen? Im Manual wird auf diese Frage ausführlich eingegangen: Connection Character Sets and Collations
Du kannst folgende Queries verwenden um zur Laufzeit zu bestimmen welchen Zeichensatz (und Kollation) du für die Kommunikation bevorzugst:
//entweder
SET NAMES utf8
//oder
SET CHARACTER SET utf8
// Der Unterschied zwischen den beiden sei von der Dokumentation zu entnehmen (oben angegeben)
Wenn du das nicht jedesmal machen willst dann musst du die entsprechenden Systemvariablen in der Konfigurationsdatei von MySQL ändern. Aber das bringt nicht viel wenn nicht alle deine Daten in deinen Datenbänken einen einheitlichen Zeichensatz haben.
MfG,
Aziz