Umlaut-Problem mit MySQL-API

Bongo

Benutzer
Beiträge
8
Hallo zusammen.

Ich schreibe, mittels einer MySQL-C-API-Funktion, Daten in eine Tabelle. Das Ganze funzt auch, bis auf das Verkorksen von Umlauten. Habe auch schon den Zeichensatz der Tabelle geändert - keine Änderung.
Die Funktion hat folgende Syntax und wird in etwa so aufgerufen:
int mysql_real_query(MYSQL*, const char*, unsigned long);
mysql_real_query(verbindung, sqlstr, strlen(sqlstr))
;

sqlstr
ist so definiert:
"UPDATE mitarbeiter SET vname='Ünal' WHERE manr=1;"


Das Ü wird immer als ein anderes Zeichen dargestellt.
Der Zeichensatz meines XPs ist cp850. Die Umlaute werden da mit Codes assoziert, die ich mit dem Wertebereich von char nicht abbilden kann. Allerdings habe ich gelesen, dass der Standard-MySQL-Client mit derselben API entwickelt wurde. Deshalb muss das doch irgendwie gehen. Weiß jemand Rat?

Gruß
Kai
 
Werbung:
Hallo zusammen.

Ich schreibe, mittels einer MySQL-C-API-Funktion, Daten in eine Tabelle. Das Ganze funzt auch, bis auf das Verkorksen von Umlauten.

Das Übliche halt. Bei MySQL.

Der Zeichensatz meines XPs ist cp850. Die Umlaute werden da mit Codes assoziert, die ich mit dem Wertebereich von char nicht abbilden kann.

Wichtig ist, daß der Client eine korrekte client_encoding angibt, dann klappt es auch mit den Umlauten. Zumindest unter PostgreSQL.
 
Jetzt läuft es. Ich habe die Stelle mit dem Umlaut einfach nachträglich manuell manipuliert und durch den cp850-Code für den Umlaut ersetzt. Verstehe allerdings nicht, warum das klappt. Die Abfrage enthält dann nicht den eigentlichen Code, den ich da rein geschrieben habe. Das wird dann wieder anders interpretiert. Die Tabelle wird aber trotzdem richtig geschrieben. Es scheint auch egal zusein, welchem Zeichensatz die Tabelle unterliegt.
Wird das innerhalb des DBMS, oder eines anderen Laufzeitelements, "wieder gerade gerückt" oder decken sich die Zeichensätze, in Bezug auf häufig verwendete Zeichen, gegenseitig ab?
 
Wird das innerhalb des DBMS, oder eines anderen Laufzeitelements, "wieder gerade gerückt" oder decken sich die Zeichensätze, in Bezug auf häufig verwendete Zeichen, gegenseitig ab?

Deutsche Umlaute kommen halt in amerikanischen Zeichensätzen (z.B.) eher selten vor. Wichtig ist halt, daß die Zeichensätze definiert sind. Demo in PG:

Code:
test=*# select * from umlaute ;
 id | umlaut
----+--------
  1 | ä
  2 | ö
  3 | ü
(3 rows)

Time: 0,188 ms
test=*# show client_encoding;
 client_encoding
-----------------
 UTF8
(1 row)

Time: 0,057 ms
test=*# set client_encoding = 'latin1';
SET
Time: 0,066 ms
test=*# select * from umlaute ;
 id | umlaut
----+--------
  1 | �
  2 | �
  3 | �
(3 rows)

test=*# set client_encoding = 'utf8';
SET
Time: 0,052 ms
test=*# select * from umlaute ;
 id | umlaut
----+--------
  1 | ä
  2 | ö
  3 | ü
(3 rows)

Das muß halt alles passen, beim Speichern der Zeichen und bei der Ausgabe.

Code:
test=*# set client_encoding = 'latin9';
SET
Time: 0,094 ms
test=*# select * from umlaute ;
 id | umlaut
----+--------
  1 | �
  2 | �
  3 | �
(3 rows)

Time: 0,189 ms
test=*# insert into umlaute values (4, 'Ä');
INSERT 0 1
Time: 0,213 ms
test=*# select * from umlaute ;
 id | umlaut
----+--------
  1 | �
  2 | �
  3 | �
  4 | Ä
(4 rows)

Time: 0,157 ms
est=*# set client_encoding = 'utf8';
SET
Time: 0,063 ms
test=*# select * from umlaute ;
 id | umlaut
----+---------
  1 | ä
  2 | ö
  3 | ü
  4 | Ã\u0084
(4 rows)
 
Werbung:
Alles klar. Dann habe ich das verstanden - hoffe ich. Aber deine Antwort ist ja einleuchtend. Ich danke dir vielmals.

Guten Rutsch ins neue Jahr.

Gruß
Kai
 
Zurück
Oben