mysql - latin1 nach utf8 - umlaute
schildi
- datenbank
hallo,
ich gehe folgendermaßen vor, um unsere mysql-datenbank nach von latin1 utf8 zu transformieren:
1. kompletter datenbank-dump mittels mysqldump
2. zum suchen u. ersetzen lade ich den dump runter, und ersetze alle vorkommen von
latin1_german1_ci mit utf8_unicode_ci
latin1 mit utf8
3. lade den dump wieder hoch
4. convertiere mittels iconv nach utf-8,
wobei sowohl
iconv -f ISO-8859-1 -t UTF8
als auch
iconv -f LATIN1 -t UTF8
nicht zum gewünschten ergebnis führt, insofern dass, nach dem
reimport in die datenbank
- Euro-Zeichen nicht korrekt umgesetzt werden
- Wörter oder ganze Sätze teilweise an den Umlauten abgeschnitten
werden
- teilweise scheinen noch andere umsetzungsprobleme bei machen
sonderzeichen aufzutreten.
SET NAMES 'utf8'; setze ich für die mysql-verbindung
die datenbank ist ebenfalls komplett auf utf8 eingestellt.
was mache ich falsch? - oder bleibt nur eine manuelle ausbesserung?
[...]
iconv -f ISO-8859-1 -t UTF8
[...]
- Euro-Zeichen nicht korrekt umgesetzt werden
[...]
Nur mal am Rande: Ist das Euro-Zeichen in ISO-8859-1 überhaupt enthalten? War das nicht in ISO-8859-15? (Mal so aus dem Gedächtnis...)
Nick
[...]
iconv -f ISO-8859-1 -t UTF8
[...]
- Euro-Zeichen nicht korrekt umgesetzt werden
[...]Nur mal am Rande: Ist das Euro-Zeichen in ISO-8859-1 überhaupt enthalten? War das nicht in ISO-8859-15? (Mal so aus dem Gedächtnis...)
naja - beim umwandeln bin ich mir ja auch net ganz sicher, ob ich nun von latin1 nach utf-8 umwandeln muss oder iso-8859-1 oder evtl -15 ?...
Nick
Hallo
jetzt mal ne gaanz noobige Frage: Wieso willst du das überhaupt umstellen? Ich hab auch ne MySQL DB und lass die immer auf der standardeinstellung, was latin1_german1_ci ist.
Da hab ich keine Probleme mit äöüß und anderen Sonderzeichen, Spaltennamen in denen äöü vorkommt habe ich statt dessen ae, oe, ue genommen und bevor ich Daten in die DB eintrage, lasse ich mit htmlspecialchars() alle Sonderzeichen in html code umwandeln
Hallo
jetzt mal ne gaanz noobige Frage: Wieso willst du das überhaupt umstellen? Ich hab auch ne MySQL DB und lass die immer auf der standardeinstellung, was latin1_german1_ci ist.
das definiert ja lediglich die collation , also sortierung.
Da hab ich keine Probleme mit äöüß und anderen Sonderzeichen, Spaltennamen in denen äöü vorkommt habe ich statt dessen ae, oe, ue genommen und bevor ich Daten in die DB eintrage, lasse ich mit htmlspecialchars() alle Sonderzeichen in html code umwandeln
kannste gerne machen, ich will lieber saubere utf-8 daten aus der datebank, und mich in zukunft nicht mehr um sonderzeichen kümmern müssen. und sollte irgendwann mal noch mehrsprachigkeit hinzukommen..
echo $begrüßung;
ich gehe folgendermaßen vor, um unsere mysql-datenbank nach von latin1 utf8 zu transformieren:
- kompletter datenbank-dump mittels mysqldump
Gibst du explizit eine zu verwendende Kodierung an? Welche MySQL-Version hat der Server, der die Ausgangsdaten liefert? Welche Default-Kodierung hat der Server.
- zum suchen u. ersetzen lade ich den dump runter, und ersetze alle vorkommen von latin1_german1_ci mit utf8_unicode_ci, latin1 mit utf8
Hoffentlich hast du diese Zeichenketten nicht als Werte in deinen Daten sondern nur in den CREATE-Statements stehen.
- convertiere mittels iconv nach utf-8,
[...]
nicht zum gewünschten ergebnis führt, insofern dass, nach dem reimport in die datenbank
- Euro-Zeichen nicht korrekt umgesetzt werden
Waren sie denn nach dem iconv überhaupt noch intakt? (Die Beantwortung der Frage dürfte sich aber nach dem Weiterlesen erübrigen.)
Das Euro-Zeichen ist in ISO-8859-1 bzw. Latin1 nicht enthalten. Finde zunächst heraus, welche Kodierung du vorliegen hast, falls du nicht den Export mit einer definierten Kodierung vornehmen kannst. Ein Programm, mit dem du dir die Hex-Werte anzeigen lassen kannst sollte dabei helfen (z.B. Ultraedit unter Windows). Siehe: http://de.wikipedia.org/wiki/ISO_8859-1
MySQLs Latin1 ist übrigens Win-1252. Wenn du also MySQL-Latin1 bzw. Win-1252 vorliegen hast, sollte nun klar sein, warum iconv nicht funktioniert hat. Außerdem kannst du es dir sparen, denn MySQL ist nämlich in der Lage, Konvertierungen vorzunehmen. Wenn du also für die Verbindung Kodierung X festgelegt hast und die Felder Kodierung Y verwenden, wandelt MySQL in lesender und schreibender Richtung die Zeichen passend um. Vorausgesetzt, es ist überhaupt technisch möglich. Zeichen, die in der Zielkodierung nicht existieren, gehen verloren.
- was mache ich falsch? - oder bleibt nur eine manuelle ausbesserung?
Meine Empfehlung: Verwende zum Importieren die zum Exportieren verwendete Kodierung und definiere explizit beide Kodierungen bei beiden Vorgängen.
echo "$verabschiedung $name";
Meine Empfehlung: Verwende zum Importieren die zum Exportieren verwendete Kodierung und definiere explizit beide Kodierungen bei beiden Vorgängen.
echo "$verabschiedung $name";
danke für deine ausführliche hilfe.
habe mich daran orientiert und im endeffekt dann den warscheinlich in erster linie ursächlichen flüchtigkeitsfehler entdeckt - iconv ausgabe nicht in datei umgeleitet :(.
hier nochmal mein vorgehen, was endgültig zu einem sauberen ergebnis zu führen scheint:
mysqldump --set-charset=latin1 --default-character-set=latin1 avl_db03 > avl_db03.latin1.dump.sql
iconv -f LATIN1 -t UTF-8 avl_db03.latin1.dump.sql > avl_db03.utf8.dump.sql
nano avl_db03.utf8.dump.sql
suchen und ersetzen (case-sens.):
latin1_german1_ci utf8_unicode_ci
CHARSET latin1 CHARSET utf8
Ü Ã^Ü
ü ü
Ö Ã^Ö
ö ö
Ä Ã^Ä
ä ä
mysql --default-character-set=utf8 avl_db02 < avl_db03.utf8.dump.sql
echo $begrüßung;
hier nochmal mein vorgehen, was endgültig zu einem sauberen ergebnis zu führen scheint:
mysqldump --set-charset=latin1 --default-character-set=latin1 avl_db03 > avl_db03.latin1.dump.sql
iconv -f LATIN1 -t UTF-8 avl_db03.latin1.dump.sql > avl_db03.utf8.dump.sql
Den iconv-Schritt kannst du dir sparen. Lass doch die Daten in MySQL-Latin1/Win-1252.
nano avl_db03.utf8.dump.sql
suchen und ersetzen (case-sens.):latin1_german1_ci utf8_unicode_ci
CHARSET latin1 CHARSET utf8
Ü Ã^Ü
ü ü
Ö Ã^Ö
ö ö
Ä Ã^Ä
ä ä
Hier musst du dich auch nicht verrenken. Wenn dein Editor Win-1252 oder ISO-8859-1 spricht, kannst du die Umlaute direkt eintippen und musst nicht die UTF-8-Bytes da reinfummeln.
mysql --default-character-set=utf8 avl_db02 < avl_db03.utf8.dump.sql
Und dem erzählst du dann einfach, dass du Character-Set latin1 verwendest und lässt MySQL den Rest machen. Das passt schon. Wenn die Kodierungen der Felder andere sind als die Kodierung der Verbindung, wandelt MySQL das selbständig um.
echo "$verabschiedung $name";
iconv -f LATIN1 -t UTF-8 avl_db03.latin1.dump.sql > avl_db03.utf8.dump.sql
Den iconv-Schritt kannst du dir sparen. Lass doch die Daten in MySQL-Latin1/Win-1252.
ok.
nano avl_db03.utf8.dump.sql
suchen und ersetzen (case-sens.):latin1_german1_ci utf8_unicode_ci
CHARSET latin1 CHARSET utf8
Ü Ã^Ü
ü ü
Ö Ã^Ö
ö ö
Ä Ã^Ä
ä äHier musst du dich auch nicht verrenken. Wenn dein Editor Win-1252 oder ISO-8859-1 spricht, kannst du die Umlaute direkt eintippen und musst nicht die UTF-8-Bytes da reinfummeln.
Ok. Das größe Ö hat hier eh irgendwie Probleme verursacht? Falsch kodiert?
mysql --default-character-set=utf8 avl_db02 < avl_db03.utf8.dump.sql
Und dem erzählst du dann einfach, dass du Character-Set latin1 verwendest und lässt MySQL den Rest machen. Das passt schon. Wenn die Kodierungen der Felder andere sind als die Kodierung der Verbindung, wandelt MySQL das selbständig um.
Achso? Gut zu wissen.
echo "$verabschiedung $name";
Vielen Dank für die Hilfe.
Zusammengefasst nochmal die Lösung des Problems:
mysqldump --set-charset=latin1 --default-character-set=latin1 dbname1 > dbname1.latin1.dump.sql
nano avl_db03.utf8.dump.sql
suchen und ersetzen (case-sens.):
latin1_german1_ci utf8_unicode_ci
CHARSET=latin1 CHARSET=utf8
Ü Ü
ü ü
Ö Ö
ö ö
Ä Ä
ä ä
ß ß
€ €
& &
é é
É É
à à
À À
" "
[...]
mysql --default-character-set=latin1 dbname2 < dbname1.latin1.dump.sql