chinesisches MySQL-Rätsel

chinesisches MySQL-Rätsel

am 02.08.2006 19:05:23 von frank_perrey

Moin, Leute
ich stoße hier gerade auf Probleme beim Herstellen
einer mehrsprachigen Homepage, die neben Deutsch und Englisch auch
chinesische Inhalte zeigen soll.


Ich bekomme die chinesischen Texte in ms-Word-Dokumenten.
Was ich bisher versucht habe:
Eingabe in MySQL 4.1 in Felder, deren Kollation auf bg2312_chinese_ci
gesetzt ist (klappt soweit, alle Zeichen werden gespeichert bleiben
erhalten),
HTML-Ausgabe mit charset GB2312

Ergebnis: nur Fragezeichen in der Darstellung und auch in der geparsten
Quelle nur solche sichtbar (direkt in die Quelle eingegebener
chinesischer Text wird aber korrekt dargestellt, also kein
css-font-problem, wie ich erst dachte)

Bevor ich mich der Lösung zuwende, die chinesischen Anteile statisch
einzubinden, frage ich hier also: hat jemand Erfahrung mit der Kombi
PHP/MySQL/Chinesisch, die er/sie bereit wäre, mit mir zu teilen?

Das Grundgerüst ist zu sehen unter
http://www.mtb-360grad-feedback.de/mtbbs/
(dort allerdings auf MySQL 4.0.irgendwas-Basis, also nur die grobe
Quelle betreffend)

Wäre sehr dankbar für Hinweise und Tipps.

gerne auch PM an frank@greenbuddha.de

Gruß und Dank
Frank

Re: chinesisches MySQL-Rätsel

am 02.08.2006 20:30:29 von Christian Kirsch

Frank Perrey schrieb:
> Moin, Leute
> ich stoße hier gerade auf Probleme beim Herstellen
> einer mehrsprachigen Homepage, die neben Deutsch und Englisch auch
> chinesische Inhalte zeigen soll.
>
>
> Ich bekomme die chinesischen Texte in ms-Word-Dokumenten.
> Was ich bisher versucht habe:
> Eingabe in MySQL 4.1 in Felder, deren Kollation auf bg2312_chinese_ci

Die *Kollation* spielt eigentlich nur eine untergeordnete Rolle, IIRC.
Eigentlich sollte der *Charset* entscheidend sein für die Ausgabe.

> gesetzt ist (klappt soweit, alle Zeichen werden gespeichert bleiben
> erhalten),
> HTML-Ausgabe mit charset GB2312
>

Ich nehme an, das ist ein Tippfehler - oben sprachst Du von bg2312?

> Ergebnis: nur Fragezeichen in der Darstellung und auch in der geparsten

Hier (Firefox auf Mac OS X) sind zumindest ein paar asiatisch aussehende
Zeichen zu sehen.

枢雺屡鰤?鯄�?�?

Keine Ahnung, ob das chinesisch oder japanisch ist und ob es das ist,
was Du willst.

> Quelle nur solche sichtbar (direkt in die Quelle eingegebener
> chinesischer Text wird aber korrekt dargestellt, also kein
> css-font-problem, wie ich erst dachte)
>

Der Seite kann man nun leider nicht ansehen, was "direkt eingegebener"
und was anderer Text ist. Die Navigation zumindest ist asiatisch.

> Bevor ich mich der Lösung zuwende, die chinesischen Anteile statisch
> einzubinden, frage ich hier also: hat jemand Erfahrung mit der Kombi
> PHP/MySQL/Chinesisch, die er/sie bereit wäre, mit mir zu teilen?
>
> Das Grundgerüst ist zu sehen unter
> http://www.mtb-360grad-feedback.de/mtbbs/
> (dort allerdings auf MySQL 4.0.irgendwas-Basis, also nur die grobe
> Quelle betreffend)
>
MySQL ist es eigentlich ziemlich wurscht, was Du in seine Textfelder
reinschreibst - das liest den Kram ja nicht. MaW: Ob das nun 2 Byte in
BG2312 oder in Latin1 sind, weiß MySQL nicht und will es auch nicht
wissen: Ein "SELECT textfeld FROM bla" sollte immer das zurückliefern,
was Du reingeworfen hast. Kritisch könnte es sein, wenn in einem String
"Sonderzeichen" wie Anführungszeichen stecken...

M.E. liegt das Problem (wenn es denn eins ist) eher woanders -
vielleicht siehst Du einfach nur deshalb Fragezeichen, weil Du keinen
geeigneten Font installiert hast?

Re: chinesisches MySQL-Rätsel

am 02.08.2006 21:11:58 von Thomas Rachel

Christian Kirsch wrote:

> Die *Kollation* spielt eigentlich nur eine untergeordnete Rolle, IIRC.
> Eigentlich sollte der *Charset* entscheidend sein für die Ausgabe.

ACK.


> MySQL ist es eigentlich ziemlich wurscht, was Du in seine Textfelder
> reinschreibst - das liest den Kram ja nicht.

Es kann es u.U. aber konvertieren - bspw. zwischen BG2312 und utf8 (wenn das
denn geht - damit kenn ich mich nicht aus) oder aber zwischen latin1 und
utf8.

> MaW: Ob das nun 2 Byte in BG2312 oder in Latin1 sind, weiß MySQL nicht und
> will es auch nicht wissen: Ein "SELECT textfeld FROM bla" sollte immer das
> zurückliefern, was Du reingeworfen hast.

Das gilt für (var)char <4.1 und für (var)binary. In dem Moment, wo Du
explizit mit charsets herumhantierst, ist es sehr wohl relevant.

> Kritisch könnte es sein, wenn in einem String
> "Sonderzeichen" wie Anführungszeichen stecken...

Die werden ja auch gequotet - und dann paßts wieder.


Thomas
--
Wos hom's gsogt? Nix hom's gsogt! Rausgschmissn homs mi!

Re: chinesisches MySQL-Rätsel

am 02.08.2006 21:58:08 von Axel Schwenke

frank_perrey@web.de (Frank Perrey) wrote:

[snip]

Obligatorische Frage: du hast das hier gelesen und verinnerlicht?

http://dev.mysql.com/doc/refman/5.0/en/charset-connection.ht ml


XL

Re: chinesisches MySQL-Rätsel

am 03.08.2006 10:19:27 von frank_perrey

Thomas Rachel wrote:

> > Kritisch könnte es sein, wenn in einem String
> > "Sonderzeichen" wie Anführungszeichen stecken...
....offenbar handelt es sich bei simplified chinese Zeichen sämtlich um
Sondernzeichen.
Ich habe gerade ein Upgrade online auf MySQL 4.1 angeschoben, dann könnt
ihr das Desaster auch online sehen (zur Zeit ist 4.0 installiert, das
ist bei Eingabe von chinesischen Zeichen per copy/paste nicht in er
Lage, diese in einem LONGTEXT-Feld zu speichern, was 4.1 offenbar sehr
wohl kann...)

Die Zeichen, die ihr jetzt online als chinesisch anmutende seht sind
übrigens ein UTF-8_konvertierungsversuch gewesen (die Überschriften
rechts oben weiß auf mint), der einzige Text, der aber richtig und ohne
ersetzende Fragezeichen angezeigt wird, ist der als chinesische Zeichen
direkt in die Quell geschriebene schwarze Text oberhalb der Navigation,
der zumindest den Schluss zulässt, dass die charset-Einstellung im
HTML-Teil stimmig ist .
http://www.mtb-360grad-feedback.de/mtbbs/?page=00&lang=cn

@Axel
tja, gelesen hab ich' natürlich schon (allerdings die 4.1-Version), mit
dem Verinnerlichen hapert's zweifellos etwas... rein syntaktisch ist mir
völlig unklar, wie ich denn die beschriebenen SET Befehle in PHP
verwenden kann, oder ob das überhaupt geht?

Auch ist mir nicht ganz klar, warum ich die client Seite SETten sollte,
die nur Felder abfragt, die numerische Werte enthalten, die sind also
character-mäßig neutral.
Verstehe ich das richtig: die character_set_results dürfte etwa in der
Gegend greifen, wo das Problem bei mir auftaucht (die chinesischen
Zeichen werden ja korrekt in MySQL gespeichert, nur der Weg bei Abfrage
schrottet die Zeichen zu Fragezeichen). Mein Verständnisproblem dabei:
kann ich denn pro SELECT-Abfrage diesen Parameter setzen oder, was ich
befürchte, ist es eine MySQL-System-Variable?

Re: chinesisches MySQL-Rätsel

am 03.08.2006 10:51:56 von Thomas Rachel

Frank Perrey wrote:

> rein syntaktisch ist mir völlig unklar, wie ich denn die beschriebenen SET
> Befehle in PHP verwenden kann, oder ob das überhaupt geht?

Es ist ein MySQL-Befehl, den Du von PHP aus antriggern willst. Wie machst Du
das denn sonst? mysql_query(). Also.

> Auch ist mir nicht ganz klar, warum ich die client Seite SETten sollte,
> die nur Felder abfragt, die numerische Werte enthalten, die sind also
> character-mäßig neutral.

Du mußt das natürlich in erster Linie bei den Abfragen machen, die die
Strings abrufen. Leider kommt aus Deinen Beschreibungen nicht ganz rüber,
welches da der Unterschied ist: Deine Webseite fragt doch auch die
Datenbank ab, oder?

Die Fragezeichen werden vermutlich von MySQL zurückgeliefert, wenn die
angefragte Konvertierung zu keinem Ergebnis führte. D.h., Du hast
vermutlich noch etwas nicht 100%ig richtig mit den Spalteninhalten und/oder
der charset-Deklaration.

Versuch doch mal, von der Kommandozeile aus folgendes auszuführen:

select cast( as binary) from und schau Dir an (bspw.
mit hexdump -C), was da tatsächlich für eine Kodierung dahintersteckt bei
dem, was Du in der Tabelle hast, und vergleiche es mit dem, was da sein
sollte. Dazu mußt Du natürlich wissen, welche Codes Deine Zeichen in dem
jeweiligen Zeichensatz haben. Wenn die angezeigten Codes nicht zu dem
Zeichensatz der Tabelle passen, mußt Du selbigen ändern.

Im nächsten Schritt kannst Du dann beginnen, mit set names ... zu arbeiten.
Das sollte auf den Zeichensatz gesetzt werden, in welchem Deine Applikation
die Daten ausgeben soll.


HTH,

Thomas



Thomas
--
87.166253% der Statistiken spielen eine Genauigkeit vor,
die durch die angewandte Methode nicht gerechtfertigt wird.

Re: chinesisches MySQL-Rätsel

am 03.08.2006 10:55:43 von frank_perrey

Frank Perrey wrote:

> Verstehe ich das richtig:


hah, offenbar ja:)
mysql_query( "SET NAMES 'gb2312'" );
?>
hat's bewirkt...puh.
Danke für Eure Mitwirkung!
Gruß Frank

Re: chinesisches MySQL-Rätsel

am 03.08.2006 11:32:42 von Axel Schwenke

frank_perrey@web.de (Frank Perrey) wrote:
>
> @Axel
> tja, gelesen hab ich' natürlich schon (allerdings die 4.1-Version), mit
> dem Verinnerlichen hapert's zweifellos etwas... rein syntaktisch ist mir
> völlig unklar, wie ich denn die beschriebenen SET Befehle in PHP
> verwenden kann, oder ob das überhaupt geht?
....
> Mein Verständnisproblem dabei:
> kann ich denn pro SELECT-Abfrage diesen Parameter setzen oder, was ich
> befürchte, ist es eine MySQL-System-Variable?

character_set_result & Co. sind MySQL-Variablen mit Session Scope. Du
mußt die also einmal nach dem Aufbau der Verbindung zu MySQL setzen.
Je nach verwendetem Datenbank-Abstraktionslayer geht das sicher auch
automatisch.


XL

Re: chinesisches MySQL-Rätsel

am 03.08.2006 14:06:23 von frank_perrey

Thomas Rachel wrote:

> Im nächsten Schritt kannst Du dann beginnen, mit set names ... zu arbeiten.
....vielen Dank für Deine Mühe, ich hab's inzwischen auch geschnallt
(siehe mein Postting 3 Minuten früher :))
Gruß und Dank
Frank

Re: chinesisches MySQL-Rätsel

am 03.08.2006 14:06:24 von frank_perrey

Axel Schwenke wrote:

> character_set_result & Co. sind MySQL-Variablen mit Session Scope. Du
> mußt die also einmal nach dem Aufbau der Verbindung zu MySQL setzen.
jau, vielen Dank, wieder so einiges an Chinesisch dazugelernt <|:o)

Gruß und Dank
Frank