| 

.NET C# Java Javascript Exception

3
Hi,
ich muß eine Datenbank in eine UTF-8 Datenbank überführen. Im Web habe ich dazu schon gefunden, dass ich sowohl das Encoding der Datenbank anpassen muß, als auch die Daten selbst. Wobei mir das nicht ganz klar ist. Werden die Daten nicht von vorn herein im UTF-8 Format intern in der Datenbank gespeichert und je nach client_encoding ausgeliefert?
Nun gut evtl. hat das ja schon jemand mal gemacht und kann mir sagen wie es effizient funktioniert.

Grüßle
07.09.2009
Scout 1,4k 2 8
4 Antworten
3
Wenn du Zugriff auf die shell hast kannst du mit dem mysqldump Tool den Zeichensatz einstellen
mysqldump --default-character-set=utf8 db_name > dump.sql


Das gleiche machst du dann beim Import
mysql --default-character-set=utf8 db_name < dump.sql


Gruss
Sebastian
07.09.2009
Forestsoft 66 1 1
3
Aufgrund der Tags vermute ich, es handelt sich um eine PostgreSQL-Datenbank

Wenn die Datenbank während der Umstellung nicht produktiv bleiben muss, hilft ein einfacher Export-/Import-Vorgang (alles machst Du als DB-Admin-User postgres):

1. Datenbank exportieren
pg_dump -E UTF8 DATENBANK > dbdump.sql

2. Datenbank löschen
dropdb DATENBANK

3. Datenbank mit neuem Encoding erstellen
createdb -E UTF8 DATENBANK

4. Inhalte wieder in die Datenbank übernehmen
psql -f dbdump.sql DATENBANK

Das sollte ausreichen. Der Systemadministrator wird es danken, wenn man anschließend noch die Dumpdatei (dbdump.sql) entweder löscht oder aber an einem geeigneten Ort archiviert.

Da man nie so genau weiß, was bei solchen Aktionen daneben geht (kleine Tippfehler haben fatale Folgen): Immer ausreichende Datensicherung betreiben!
08.09.2009
Churke 211 1 2
2
Ich musste das einmal machen und habe mich da einem einfachen Trick beholfen.
Das Problem war, dass Umlaute zerstört waren. Also habe ich das kompletten SQL-Backup in meinen Editor eingefügt, alle Umlaute "repariert".
Danach habe ich dann das komplette Backup in die "neue" Datenbank eingefügt.
Ging ehrlich gesagt echt super und der Vorteil ist die Barierefreiheit von UTF-8.
Ich hoffe, ich konnte dir ein wenig helfen :)

M.f.G.
DarkDust

P.S.: By the way -> gute Frage ;) +1 bekommste von mir
07.09.2009
darkdust 451 2 6
danke dir ;-)
Scout 08.09.2009
1
Werden die Daten nicht von vorn herein im UTF-8 Format intern in der Datenbank gespeichert und je nach client_encoding ausgeliefert?

Nein. UTF-8 betriftt nur Zeichenketten, eine DB kann auch binäre Daten speichern, die keine Zeichenketten sind. Es ist eher so, daß alle Daten raw gespeichert werden.
Dafür ist UTF-8 oder nicht UTF-8 unerheblich. Außerdem beherrschen die DBs meistens viele Zeichensätze, nicht nur UTF-8. Das Client-Encoding hat Auswirkungen auf die interne Umcodierung vor, für und nach der Übertragung.
In der Kombination MySQL / PHP z.B. hängt es von einigen Faktoren ab, ob die Codierung die rauskommt auch die ist, die reinging. Die Datenbankengine (Server) hat quasi einen Zeichensatz, die logische Datenbank selbst einen Zeichensatz, die Tabelle und Felder auch. Die Verbindung vom DB-Serverdienst zum Client hat einen Zeichensatz und der Client hat auch einen Zeichensatz. Einige Einstellungen werden ausgehandelt, andere sind fix. Dazwischen wird ggf. hin- und hercodiert. Das entzieht sich teilweise dem Einfluß des Anwenders / Programmierers.
So kann es dann passieren, das ein schöner UTF-8-String als Gurkensalat zurückkommt.

Das Kommando von Sebastian sieht gut aus, kann aber auch schiefgehen.
Das funktioniert so aber nur, wenn Du mysql verwendest. Eine anderes DBMS könnte andere Befehle erwarten.
Ggf. hilft "set names utf8" (ohne Anführungszeichen), wenn die Shell nativ auf ISO läuft und die Umlautcodierung schief geht. Vermutlich wird der dump aber bereits ein entsprechendes Kommando haben, respektive die Angabe von --default-character-set regelt das in Deinem Sinne. Vor dem Dump die Tabellen prüfen und Zugriffe verhindern, sonst kann es zu Inkonsistenzen kommen. MySQL ist nicht automatisch transaktionssicher und ein Dump während das DBMS arbeitet, kann halbfertige Updates enthalten.
07.09.2009
tomahlak 237 1 2

Stelle deine Datenbank-Frage jetzt!