UTF-8 Zeichen in latin1 Spalte - konvertieren?

UTF-8 Zeichen in latin1 Spalte - konvertieren?

am 27.05.2007 14:27:46 von Johannes Vogel

Hi Leute

Ich habe in einer Text-Spalte (charset latin1) Unicode Zeichen mit ord()
in (50108,50080,...) = ('ä','ö',...). Ich möchte die nun in latin1-Codes
umwandeln.

1. Versuch: Die Spalte via `alter table Tab modify Col varchar(200)
character set utf8` und dann `alter table Tab modify Col varchar(200)
character set latin1` konvertieren. Dabei wird aber am Inhalt offenbar
nichts verändert, denn die Zeichen sind noch immer dieselben. Auch gut,
aber nicht, was ich wünschte.

2. Versuch: `update Tab set Col = replace(Col,ascii(50108),'ä');` ist
ebenfalls nicht möglich, weil ascii() nur bis 255 versteht.

Any idea, wie ich das reparieren kann?
Merci, Johannes

Re: UTF-8 Zeichen in latin1 Spalte - konvertieren?

am 27.05.2007 14:35:02 von Claus Reibenstein

Johannes Vogel schrieb:

> Ich habe in einer Text-Spalte (charset latin1) Unicode Zeichen mit ord()
> in (50108,50080,...) = ('ä','ö',...). Ich möchte die nun in latin1-Codes
> umwandeln.

Wie sind diese "Unicode Zeichen" denn codiert? UTF-8? Falls ja:
- die Codierung der Spalte auf UTF-8 setzen
- eine neue Spalte mit latin1 erzeugen
- die Daten aus der alten Spalte in die neue kopieren
- alte Spalte löschen
- neue Spalte mit altem Namen versehen

Gruß. Claus

Re: UTF-8 Zeichen in latin1 Spalte - konvertieren?

am 27.05.2007 20:35:37 von Johannes Vogel

Hallo Claus

Claus Reibenstein wrote:
> Johannes Vogel schrieb:
>> Ich habe in einer Text-Spalte (charset latin1) Unicode Zeichen mit ord()
>> in (50108,50080,...) = ('ä','ö',...). Ich möchte die nun in latin1-Codes
>> umwandeln.
> Wie sind diese "Unicode Zeichen" denn codiert? UTF-8? Falls ja:
> - die Codierung der Spalte auf UTF-8 setzen
> - eine neue Spalte mit latin1 erzeugen
> - die Daten aus der alten Spalte in die neue kopieren
> - alte Spalte löschen
> - neue Spalte mit altem Namen versehen

Das hab ich so ausprobiert. Leider ohne Erfolg. :-(

set names latin1;
Hier, was es ausgibt: g▒be (gäbe), m▒ssen (müssen)

Wenn ich ord() ausführe, finde ich wie erwähnt 50108 und 50080 vor.
Die Spalte ich character set latin1 angegeben.

Oups, nein, jetzt sind sie 228 bzw. 252.
Wenn ich aber nun `update crmInvoices set subject =
replace(subject,ascii(228),'ä');` ausführe, passiert nichts. Auch bei
252 nicht. :-( Matched sind's 937 rows, aber Changed sind 0. Obwohl
`select ord('ä');` die Zahl 195 ausgibt...

mysql> show variables like 'character_set\_%';
+--------------------------+--------+
| Variable_name | Value |
+--------------------------+--------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
+--------------------------+--------+

Any more hints?
Johannes

Re: UTF-8 Zeichen in latin1 Spalte - konvertieren?

am 28.05.2007 17:25:20 von Axel Schwenke

Johannes Vogel wrote:
>
> Ich habe in einer Text-Spalte (charset latin1) Unicode Zeichen mit ord()
> in (50108,50080,...) = ('ä','ö',...). Ich möchte die nun in latin1-Codes
> umwandeln.

[untaugliche Versuche gesnipt]

In schöner Übereinstimmung mit dem Handbuch:
http://dev.mysql.com/doc/refman/5.0/en/alter-table.html
funktioniert die Umwandlung der Daten per ALTER TABLE nicht,
wenn das deklarierte Encoding vom wahren Encoding abweicht.
Tatsächlich kann man sich so seine Daten leicht zerschießen.

Natürlich kennt das Handbuch auch eine Lösung:
http://dev.mysql.com/doc/refman/4.1/en/charset-conversion.ht ml


Du mußt also deine Spalte dreimal umwandeln:

- erstmal in einen binären Typ (VARBINARY, BLOB etc.). Dabei bleiben
alle Daten unverändert, aber die Encoding-Information wird entfernt.

- dann in den tatsächlichen Typ, also utf8. Auch jetzt bleiben die
Daten unverändert, allerdings ist jetzt das Encoding korrekt.

- schließlich in den Ziel-Typ, also latin1. Jetzt werden die Daten
auch konvertiert.


XL