MySQL: Charset von ganzen Datenbanken bzw. Tables konvertieren

MySQL LogoAktuell stand ich vor dem Problem ein größeres Datenvolumen in die SQL-Datenbank eines bestehendes Projekt zu integieren. Nach Wiederherstellung der Daten aus einem SQL-Hotbackup, bemerkte ich das die „neuen“ Datenbanken und Tabellen alle im Charset „latin1“ bzw. der Collation „latin1_german1_ci“ definiert waren, wo hingegen die bestehenden Datenbanken des Projekts alle im Charset „utf8“ definiert waren.

Das ist mehr als nur ein kosmetisches Problem, denn es bedeutet das sämtliche Felder die Zeichenketten enthalten eine andere binäre Kodierung bei Sonderzeichen wie Umlaute enthalten. MySQL als Datenbank-System ist zwar in sehr flexibler Weise darauf ausgelegt Daten aus unterschiedlichen Charset zu handhaben. Aber dazu müsste eine Applikation die auf die Datenbank zugreift bewusst das Charset anmelden in der sie die Daten dann erwartet. Dazu kann eine Applikation nach öffnen der Verbindung zu einem MySQL-Server folgende Variablen setzen:

--
mysql> SHOW SESSION VARIABLES LIKE "%char%";
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
--
-- Für eine korrekte Verarbeitung auf Clientseite müssen folgende
-- 3 Variablen gesetzt werden
--
mysql> SET character_set_client=utf8, character_set_connection=utf8, character_set_results=utf8;
--
--
mysql> SHOW SESSION VARIABLES LIKE "%char%";
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
--

Nun werden die Daten zwar unabhängig von tatsächlichen Charset in dem sie abgelegt sind ausgeliefert, allerdings hat das den nicht unerheblichen Nachteil das MySQL ständig Charset-Konvertierungen vornehmen muss. Besser ist es man bringt Daten und Applikationen unter einen Hut bzw. ein Charset, so dass überhaupt keine Konvertierungen stattfinden müssen. Damit eine Umstellung nicht in Sysiphus-Arbeit ausartet, kann man über ein einziges SQL-Kommando automatisch alle Felder einer Tabelle auf ein beliebiges Charset umstellen und die bestehenden Daten konvertieren lassen.

--
ALTER TABLE `tabellenname` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
--

 

Links

http://dev.mysql.com/doc/refman/5.1/de/charset-column.html

http://dev.mysql.com/doc/refman/5.1/de/alter-table.html

1 Kommentare.