Die Collation oder Kollation in einem SQL-Server wird häufig mit dem verwendeten Zeichensatz verwechselt. Naheliegend, dass bei der Bezeichnung „latin1_german“ oder „utf-8“ sofort an den zugrundeliegenden Zeichensatz gedacht wird. Zumal der Gedanke keineswegs so abwegig ist, worauf ich später noch zurückkomme.
Was bestimmt die Collation in der MySQL-Datenbank?
Collations bestimmen die Sortierreihenfolgen eines SQL-Servers, beispielsweise in ORDER BY-Abfragen. Wenn eine SQL-Abfrage Textfelder auf- oder absteigend sortieren soll, ist es wichtig zu wissen, wie beispielsweise deutsche Umlaute behandelt werden sollen. Dies wird durch die verwendete Collation festgelegt.
Für den deutschen Sprachraum sind zwei Collations in MySQL vorhanden: „latin1_german1_ci“ und „latin1_german2_ci“. Diese basieren auf DIN-1 und DIN-2-Normen (Deutsches Institut für Normung) und werden gerne im Sprachgebrauch mit „Wörterbuchsortierung“ (DIN-1) und „Telefonbuchsortierung“ (DIN-2) bezeichnet. Vereinfacht kann gesagt werden, dass die „Wörterbuchsortierung“ („latin1_german1_ci“) einen Deutschen Umlaute wie beispielsweise das „Ä“ als „A“, das „Ö“ als „O“, das „Ü“ als „U“ und das „ß“ als „s“ bei der Sortierung behandelt. Die „Telefonbuchsortierung“ („latin1_german2_ci“) setzt das „Ä“ als „AE“, das „Ö“ als „OE“ und das „Ü“ als „UE“ für die Sortierung um. Weitere Informationen über die Collation und deren Unterschiede können im MySQL-Referenzhandbuch nachgelesen werden.
Warum verwendet MySQL per Standard die Collation „latin1_swedish_ci“?
Eine gute Frage, auf die ich auch keine erklärende Antwort habe. Je nach Datenbank ist die Angabe der Collation auch relativ unwichtig (eben nur wichtig, wenn per „ORDER BY text“ sortiert werden soll) und muss nur bei Bedarf geändert werden. In der my.ini kann die Collation für neu zu erstellende Tabellen geändert werden:
[mysqld]
default-character-set=latin1
default-collation=latin1_german1_ci
[mysql]
default-character-set=latin1
default-collation=latin1_german1_ci
Bereits bestehende Tabellen werden von dieser Änderung nicht erfasst. Wer „phpmysql“ auf seinem Datenbankserver installiert hat, kann die Collation mit wenigen Mausklicks je Tabelle ändern.
Ändern der Collation per Command-Line:
In die MySQL-Command möglichst per SSH einloggen:
mysql -h [LOCALHOST] -u [USER] – p [PASSWORD]
ALTER DATABASE db_ Tabellen_Name
CHARACTER SET [charset_name]
COLLATE [collation_name]
Also beispielsweise:
ALTER TABLE Tabellen_Name CHARACTER SET utf8 COLLATE utf8_general_ci;
Weitere Informationen über das Ändern der Collation im MySQL können direkt aus dem MySQL-Referenzhandbuch übernommen werden.
Ist die Collation „utf8_general_ci“ eine gute Wahl?
Mit einem Wort: Ja. UTF-8 ist sozusagen die „Eierlegende-Wollmilch-Sau“. Ich persönlich hinterlege die Collation immer als Standard und hatte bisher noch nie das Bedürfniss, diese dann noch einmal in „latin1_german1_ci“ oder „latin1_german2_ci“ zu ändern. Im Hinterkopf sollte man einfach behalten, dass die Sortierung der Umlaute UTF-8 nicht unbedingt so erfolgt, wie man dies vielleicht erwartet; bei Bedarf kann man dies jederzeit durch die Änderung der Collation ändern.
Und nun die Preisfrage: Wie genau sortiert die Collation „utf8_general_ci“? Einfach eine kleine Tabelle mit ein paar Begriffen inklusive deutschen Umlauten aufbauen und ausprobieren!
Hallo Sirmarks, habe gerade eine sehr gute Erklärung zu „MySQL-Collation latin1_german1_ci oder latin1_german2_ci?“ gelesen. Ich bin auf der Suche nach einer Lösung: wir pflegen über ein Verwaltungsmodul eine Bildatenbank in sql. Die Bilder werden betextet und verschlagwortet. Nun ist uns aufgefallen, daß Texte die ein Abostroph enthalten ( z.B. don`t) nicht gespeichert werden. Ein weiters Problem ist, daß Anführungszeichen („) als Fragezeichen(?) wiedergegeben werden. Vielleicht weißt Du einen Ansatz wo das Problem stecken könnte. Vielen dank für Deine Mühe. Gruß Lenebooks
Du musst auf jeden Fall Hochkommas maskieren. Hier ist jetzt weniger der Zeichensatz ein Problem, als der SQL-Syntax. I.d.R. genügt ein Vorstellen von „\“, also beispielsweise \‘