1 |
Hallo. |
2 |
|
3 |
Am Dienstag, 28. November 2006 00:38 schrieb Sebastian Damm: |
4 |
> Systeminformationen: |
5 |
> Alt Neu |
6 |
> MySQL 4.1.15 MySQL 5.0.26 |
7 |
> Locale latin9 Locale utf8 |
8 |
|
9 |
Auf einem System, das grundsätzlich auf latin9 hochgezogen ist, fällt es |
10 |
natürlich schwer, fernöstliche Zeichen korrekt zu speichern... |
11 |
|
12 |
|
13 |
> Nun hab ich mich natürlich gefragt, wie ich das am besten gerade biegen |
14 |
> kann. Soweit ich weiß, speichert MySQL ab Version 4.1 die Daten schon |
15 |
> in UTF8 ab, also sollten die schon korrekt vorliegen. Ich habe |
16 |
|
17 |
Jein. |
18 |
MySQL hat (zumindest in Version 5) eine strikte Trennung zwischen Speicherung |
19 |
und Präsentation im Frontend. Leider wissen das viele nicht. ;-) |
20 |
|
21 |
Irgendwo mitten in den 4.1.*-Versionen gab es einen Bruch, vorher kommt MySQL |
22 |
nicht korrekt mit den Zeichensätzen umgehen. Ob es vor oder nach 4.1.15 war, |
23 |
weiß ich nicht. |
24 |
|
25 |
Teste bitte: |
26 |
greife mit einer Locale (und schriftart) die alle deine Zeichen anzeigen kann |
27 |
auf den MySQL-Server zu (mit dem Konsolenprogram). Dann gib als erstes den |
28 |
Befehl "SET NAMES utf8;" ein. Oder eben mit deiner anderen locale, aber UTF8 |
29 |
ist halt die beste für den Zweck. |
30 |
|
31 |
Lies dann mit SELECT * FROM foobar; eine Tabelle aus, die solche Zeichen |
32 |
enthält. |
33 |
Wenn das alles korrekt rauskommt, dann ist es trivial, dann hat MySQL es |
34 |
intern schon korrekt gespeichert. Dann kannst du ganz einfach die |
35 |
my.cnf-Direktive |
36 |
init-connect='SET NAMES utf8' |
37 |
in die my.cnf eintragen und mit mysqldump einen UTF8-codierten dump erzeugen. |
38 |
|
39 |
Wenn du oben aber Schrott bekommst, dann ist genau das schlimme passiert: |
40 |
MySQL hat die Daten die da kommen mehr oder weniger Binär gespeichert. Also es |
41 |
macht keine Prüfung und keine Konversion sondern speichert die codierte |
42 |
Version so wie sie kommt. Solange man immer den selben Weg zur Ausgabe wählt, |
43 |
der auch zur Eingabe benutzt wurde, ist das kein Thema, es wird dann gleich |
44 |
repräsentiert. Nur ist es dann ein anderer Charset als MySQL vielleicht |
45 |
denkt. |
46 |
|
47 |
|
48 |
> Alle hatten nicht den gewünschten Erfolg. Die mittlere Variante sah am |
49 |
> schlimmsten aus, deshalb nehme ich mal an, dass die Daten schon in UTF8 |
50 |
> vorliegen. |
51 |
|
52 |
Ich tippe auf einen Datensalat. |
53 |
Also manches UTF8-codiert und manches nicht. Sehen denn wirklich alle |
54 |
Webseiten auf dem alten System korrekt aus? |
55 |
|
56 |
|
57 |
> Wenn ich mir die DB im phpMyAdmin anschaue, sind die Sonderzeichen |
58 |
> sowohl im alten als auch im neuen System verrissen. |
59 |
|
60 |
phpMyAdmin setzt den Zeichensatz wie ich oben schrieb, es ist also |
61 |
wahrscheinlich, dass obiges ebenfalls nicht funktioniert. |
62 |
Dann kommst du mit MySQL-Werkzeugen nicht mehr weiter. Du solltest den |
63 |
MySQL-dump sichern und mit Text-Konversions-Werkzeugen irgendwie herausfinden |
64 |
was wie codiert ist und wie du es nach UTF-8 konvertieren könntest. |
65 |
|
66 |
|
67 |
> Achja, eine Erschwerniss hab ich noch: In dem Blog sind ein paar |
68 |
> Einträge auf chinesisch geschrieben (oder zumindest Teile), d.h. |
69 |
> Konvertieren in Latin9 fällt aus. |
70 |
|
71 |
Kann es sein, dass die westlichen Zeichen als latin9 und die fernöstlichen |
72 |
Zeichen als whatever-Zeichensatz gespeichert sind? Wurden die echt vorher |
73 |
korrekt angezeigt? Ich kann mir das jetzt so garnicht vorstellen... |
74 |
|
75 |
|
76 |
> Da das sicher schon mal jemand gemacht hat, weiß doch hier sicher |
77 |
> jemand Rat, oder? Danke schonmal. |
78 |
|
79 |
Ich hatte mal die Situation, dass alte Einträge aners codiert waren als neue. |
80 |
Das habe ich Aufwand/Nutzen-mäßig dann aber ignoriert, wäre viel Arbeit |
81 |
gewesen... |
82 |
|
83 |
cu, Bernd |
84 |
|
85 |
-- |
86 |
Windows Error 01E: Timing error. Please wait. And wait. And wait. |