MySQL DB von latin1 auf UTF8 umstellen
hawkmaster
- datenbank
1 dedlfix
0 hawkmaster0 dedlfix
0 hotti0 hawkmaster0 hotti
Hallo zusammen,
meine MySQL DB mit ca. 70 Tabellen ist momentan in latin1.
Ich möchte nun gerne alles auf utf8 umstellen.
Welche Vorgehensweise könnt ihr mit empfehlen?
Hat so etwas schon mal jemand gemacht?
Sollte man jede Tabelle einzeln mit:
ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;
umwandeln?
Oder wäre es besser einen Dump zu machen und dann im exportierten SQL File alle Zeilen mit "DEFAULT CHARSET=latin1" ersetzen durch UTF-8 ?
Gibt es irgend etwas zu beachten wegen den Daten an sich?
Teilweise sind Wörter in französisch gespeichert also mit ',`,´ und anderen Zeichen.
eine Tabelle enthält verschlüsselte Passwörter mit Sonderzeichen. Können die nach der Umwandlung auch wieder gelesen werden, vorrausgesetzt der Client liest natürlich auch mit UTF-8
Recht es wenn ich alle PHP Seiten auf
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
ändere?
vielen Dank und viele Grüße
hawk
echo $begrüßung;
meine MySQL DB mit ca. 70 Tabellen ist momentan in latin1. Ich möchte nun gerne alles auf utf8 umstellen.
Sollte man jede Tabelle einzeln mit:
ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;
umwandeln?
Das ist nur ein Default-Wert für neu zu erstellende Felder. Ebenso ist der Wert für eine Datenbank nur ein Default-Wert für die darin neu zu erstellende Tabellen. Letzlich zählt die Kodierung jedes einzelnen Feldes.
Oder wäre es besser einen Dump zu machen und dann im exportierten SQL File alle Zeilen mit "DEFAULT CHARSET=latin1" ersetzen durch UTF-8 ?
Den solltest du unabhängig von der gewählten Vorgehensweise machen. Beim Dumpen und beim Einlesen musst du auf die Angabe der korrekten Kodierung achten. Der phpMyAdmin dumpt immer in UTF-8, wenn du nichts angibst oder nichts angeben kannst (wenn iconv oder recode nicht installiert ist).
Eine schnelle augenscheinliche Prüfung der Kodierung ist über einen Browser möglich. Öffnen des Dumps über "Datei öffnen" und im Menü Ansicht die Zeichenkodierung auf UTF-8 oder Windows-1252 stellen (MySQLs Latin1 entspricht Windows-1252). Wenn alle Zeichen richtig zu sehen sind, kann man davon ausgehen, dass diese Kodierung vorliegt.
Gibt es irgend etwas zu beachten wegen den Daten an sich?
Solange die angegebenen Kodierung des Feldes mit der tatsächlichen Kodierung des Inhalts übereinstimmt, ist nichts zu beachten. Ein ALTER-Statement für die betroffenen Felder ist dann ausreichend.
Teilweise sind Wörter in französisch gespeichert also mit ',`,´ und anderen Zeichen.
Solange die verwendete Kodierung diese Zeichen beinhaltet ist das kein Problem.
eine Tabelle enthält verschlüsselte Passwörter mit Sonderzeichen. Können die nach der Umwandlung auch wieder gelesen werden, vorrausgesetzt der Client liest natürlich auch mit UTF-8
Ja, darf kein Problem darstellen, wenn du alles richtig gemacht hast.
Recht es wenn ich alle PHP Seiten auf
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
ändere?
Nein. Zum einen ist der HTTP-Header gleichen Namens stärker, zum anderen musst du bei der Kommunikation mit dem DBMS angeben, welchen Kodierung du auf dieser deiner aktuellen Verbindung zu verwenden gedenkst. Notfalls geht das für die ISO-8859- und Latin-Familie sowie UTF-8 mit einem "SET NAMES"-Statement, besser wäre die mysql_set_charachter_set() aus der MySQL-API zu verwenden oder deren Pendant in der jeweiligen Umgebung (z.B. PHP: mysql_set_charset() und mysqli_set_charset()). Ohne die explizite Aushandlung verwendet MySQL einen Default-Wert, was zu Datenverlust führen kann, weil es die Daten falsch interpretiert beziehungsweise ausliefert und weil beim Umkodieren der Daten zum Eintragen in die Felder technisch bedingt Zeichen verloren gehen können.
echo "$verabschiedung $name";
Hallo dedlfix,
schön mal wieder deine tollen und qualifizierten Erläuterungen zu lesen.
vielen Dank dafür.
Das ist nur ein Default-Wert für neu zu erstellende Felder. Ebenso ist der Wert für eine Datenbank nur ein Default-Wert für die darin neu zu erstellende Tabellen. Letzlich zählt die Kodierung jedes einzelnen Feldes.
Verstehe ich dich richtig, dass ich also jede einzelne Tabelle und hier wiederum jede einzelne Spalte von Hand ändern muss.
Etwa mit;
ALTER TABLE tabellen\_name
CHANGE Spalte1
Spalte2
CHARACTER SET utf8 COLLATE utf8_general_ci ; ?
Den solltest du unabhängig von der gewählten Vorgehensweise machen. Beim Dumpen und beim Einlesen musst du auf die Angabe der korrekten Kodierung achten. Der phpMyAdmin dumpt immer in UTF-8, wenn du nichts angibst oder nichts angeben kannst (wenn iconv oder recode nicht installiert ist).
Nochmals zum Dump.
Angenommen ich exportiere die gesamte DB mit PhpMyAdmin. Wenn ich dann die SQL Datei mit "iconv" (das gibt es glaube ich auch für Windows) in UTF8 umwandle und alle Zeilen wo "DEFAULT CHARSET=latin1" ersetze durch UTF-8.
Und dann mit PhpMyAdmin (eingestellt auf UTF-8) wieder zurückspiele, müsste es doch eigentlich auch funktionieren oder?
Nein. Zum einen ist der HTTP-Header gleichen Namens stärker, zum anderen musst du bei der Kommunikation mit dem DBMS angeben, welchen Kodierung du auf dieser deiner aktuellen Verbindung zu verwenden gedenkst. Notfalls geht das für die ISO-8859- und Latin-Familie sowie UTF-8 mit einem "SET NAMES"-Statement, besser wäre die mysql_set_charachter_set() aus der MySQL-API zu verwenden oder deren Pendant in der jeweiligen Umgebung (z.B. PHP: mysql_set_charset() und mysqli_set_charset()).
Ja das mit dem SET Names habe ich auch gelesen. Hatte ich bisher nicht gemacht. Ich arbeite mit PDO. Dann müsste ich das entsprechende PDO Statement gleich nach der Connection für UTF-8 angeben?
Wenn ich dann zusätzlich noch folgende Änderungen vornehme:
Im Apache die httpd.conf auf;
ddDefaultCharset utf-8
In der PHP.ini
[PHP]
default_charset = “utf-8″
[mbstring]
mbstring.language = utf-8
mbstring.internal_encoding = utf-8
mbstring.http_input = utf-8
mbstring.http_output = utf-8
und in der MySQL my.cnf Datei;
[client]
default-character-set = utf8
[mysqld]
default-character-set = utf8
character-set-server = utf8
collation-server= utf8_general_ci
init_connect = ‘SET collation_connection = utf8_general_ci’
init_connect = ‘SET NAMES utf8′
[mysqldump]
default-character-set = utf8
[mysqlimport]
default-character-set = utf8
[mysql]
default-character-set = utf8
angebe, dann müsste ich doch eigentlich auf der sicheren Seite sein.
Was meinst du?
vielen Dank und viele Grüße
hawk
echo $begrüßung;
Verstehe ich dich richtig, dass ich also jede einzelne Tabelle und hier wiederum jede einzelne Spalte von Hand ändern muss.
Etwa mit;
ALTER TABLEtabellen\_name
CHANGESpalte1
Spalte2
CHARACTER SET utf8 COLLATE utf8_general_ci ; ?
Man muss nur genau lesen. Da ich das lange nicht gemacht habe und meine damals nicht sehr vielen Tabellen zu Fuß umgestellt hatte, war mir die Alles-auf-einmal-Lösung nicht geläufig. Das Statement aus deinem OP konvertiert aber laut Handbuch auch die Spalteninhalte. Mach es einfach mal mit einer Kopie und wenn es nicht geklappt hat, kannst du sie wieder löschen. Hauptsache, du schaust vorher und nachher mit dem phpMyAdmin ob er alles richtig anzeigt. (Vom PMA weiß ich, dass er alles richtig macht.)
» Den solltest du unabhängig von der gewählten Vorgehensweise machen. Beim Dumpen und beim Einlesen musst du auf die Angabe der korrekten Kodierung achten. Der phpMyAdmin dumpt immer in UTF-8, wenn du nichts angibst oder nichts angeben kannst (wenn iconv oder recode nicht installiert ist).
Angenommen ich exportiere die gesamte DB mit PhpMyAdmin. Wenn ich dann die SQL Datei mit "iconv" (das gibt es glaube ich auch für Windows) in UTF8 umwandle und alle Zeilen wo "DEFAULT CHARSET=latin1" ersetze durch UTF-8.
Und dann mit PhpMyAdmin (eingestellt auf UTF-8) wieder zurückspiele, müsste es doch eigentlich auch funktionieren oder?
Schau nach, ob dein PMA dir beim Dumpen die Auswahl einer Kodierung erlaubt. Wenn nicht, dumpe einfach so, öffne die Datei im Browser und stell die Kodierung auf UTF-8. Alles richtig? - Bestens. Beim Import dann auf UTF-8 achten, denn da ist auf jeden Fall eine Kodierungsauswahlmöglichkeit vorhanden.
Ja das mit dem SET Names habe ich auch gelesen. Hatte ich bisher nicht gemacht. Ich arbeite mit PDO. Dann müsste ich das entsprechende PDO Statement gleich nach der Connection für UTF-8 angeben?
PDO hat kein Equivalent zu mysql(i)_set_charset(), da brauchst du nach jedem Connect (PDO-Objekt-Erstellen) einmal SET NAMES.
Wenn ich dann zusätzlich noch folgende Änderungen vornehme:
Im Apache die httpd.conf auf;
ddDefaultCharset utf-8In der PHP.ini
[PHP]
default_charset = “utf-8″
Diese PHP-Einstellung übernimmt das Senden der charset-Angabe im HTTP-Header. Das gleiche macht die Apache-Direktive. Du brauchst nur eins davon.
[mbstring]
Die MB-String-Extension benötigst du nur, wenn du mit PHP UTF-8-Strings bearbeiten willst. Reichst du die Daten einfach nur durch, brauchst du dich um MB-Strings nicht zu kümmern.
und in der MySQL my.cnf Datei;
init_connect = ‘SET collation_connection = utf8_general_ci’
init_connect = ‘SET NAMES utf8′
Der erste Eintrag ist überflüssig, SET NAMES erledigt den mit. Wenn du hier schon SET NAMES setzt, brauchst du es im PDO nicht. (Lass aber die ‘′ weg!)
[mysqldump]
default-character-set = utf8
[mysqlimport]
default-character-set = utf8
[mysql]
default-character-set = utf8
Das sind Einstellungen für die Kommandozeilentools. Wenn du diese Tools verwendest, kannst du das so nehmen.
angebe, dann müsste ich doch eigentlich auf der sicheren Seite sein.
Viel hilft viel? "Viel" bedeutet auch viel Pflegeaufwand. Beschränke dich auf jeweils eine Konfiguration und schau zu jeder Änderung nach, ob sie was gebracht hat. Setzt natürlich voraus, dass man weiß, was sie bewirkt. Eigentlich steht das ja in der jeweiligen Dokumentation, aber deine Liebe dazu kenne ich ja ;-)
echo "$verabschiedung $name";
Hallo dedlfix,
»»Eigentlich steht das ja in der jeweiligen Dokumentation, aber deine Liebe dazu kenne ich ja ;-)
oh, schäm ,
ich gebs ja zu.
Wobei ich heute zum Thema Zeichensätze im MySQL doc
http://dev.mysql.com/doc/refman/5.1/de/charset.html
schon ziemlich viel gelesen habe.
es ist nur halt manchmal schwierig wo man was nachlesen soll.
Wenn man dann noch in vielen Blogs oder Tutorials recht unterschiedliche Vorgehensweisen sieht, ist man erst recht verwirrt.
Ich danke dir auf jedenfall für deine Hilfe und Erklärungen.
vielen Dank und viele Grüße
hawk
hi,
meine MySQL DB mit ca. 70 Tabellen ist momentan in latin1.
Ich möchte nun gerne alles auf utf8 umstellen.
Was ist bei Dir 'latin1' und was möchtest Du denn umstellen?
Die Inhalte?
die Engine?
die Collation?
Hotte
HAllo Hotte,
Was ist bei Dir 'latin1' und was möchtest Du denn umstellen?
Die Inhalte?
die Engine?
die Collation?
Eigentlich ist alles Latin1, also der Server, die DB und die einzelnen Spalten.
Da die ganze Anwendung aber mehrsprachig aufgebaut wird und ich nicht weiss welche Sprachen in Zukunft verwendet werden, möchte ich gerüstet sein und alles auf UTF8 umstellen.
vielen Dank und viele Grüße
hawk
hi,
Da die ganze Anwendung aber mehrsprachig aufgebaut wird und ich nicht weiss welche Sprachen in Zukunft verwendet werden, möchte ich gerüstet sein und alles auf UTF8 umstellen.
Ok, ein paar Worte auch von mir dazu.
Collation: interessiert nur bei Sortier- und Vergleichsfunktionen.
Charset: seit MySQL 4.1 hat jeder textliche Inhalt einen Stempel mit dem Charset.
Für Beides gibts Default-Einstellungen, die vererblich sind. Die Collation ist spaltenbezogen (gilt für einzelne Felder). Charset: Server -> Engine -> Tabelle.
Der Charset entscheidet über die Platzreservierung für die Daten. Ein char(20) in Latin kriegt 20 Byte reserviert, für ein char(20) in utf-8 hingegen werden 60 Byte reserviert.
Es ist möglich, dass eine Zeichenkette als latin1 getagged (deklariert) ist, jedoch utf-8 Zeichen enthält. Die Collation ist an Charset gebunden.
Ergo: Wenn Du genügend Platz reserviert hast und keine Sortier- oder Vergleichsfunktionen nutzen musst, kann Dir collation und charset egal sein, da musst Du gar nichts umstellen.
Hotte