HTML-Form -> Unicode -> Datenbank
Christian Wallmer
- datenbank
Guten Morgen,
ich habe da mal eine Frage bezüglich der Persistierung von
Unicode in eine MySQL-Datenbank:
Ich habe eine HTML-Form (accept-charset="UTF-8"), mit der
ich zB folgenden String absende:
"й Дмитрий Дмитрий Дмитрий Дмитрий Дмитрий Дмитри
й Дмитрий Дмитрий Дмитрий Дмитрий Дмитрий Дмитри
Süddeutsche Länder"
MySQL macht mir daraus dann folgenden String - die Spalten der
Tabelle besitzen als Collation "utf8_unicode_ci" (*):
"й Дмитрий Дмитрий Дмитрий Дмитрий Дмитрий Дмитри<br />
й Дмитрий Дмитрий Дмитрий Дмитрий Дмитрий Дмитри<br />
Süddeutsche Länder"
Nun würde ich gerne mal von einem Fachmann wissen wollen,
ob das auf diese Art und Weise korrekt vonstatten geht?
Das Auslesen des Datensatz klappt auch wunderbar. Scheint
ja alles so weit OK zu sein; doch wundert es mich
ein wenig, dass ich die Daten so nicht mehr lesen kann
(zB mit PhpMyAdmin) (da unleserlich) bzw. mir das dort
oben zudem nicht wirklich wie Unicode ausschaut.
(*)
Warum bietet mir MySQL bei den SpaltenTypen für UTF8 lediglich
die Reihe der "Case-Insensitiven" an? So weit ich weiß ist doch
eigentlich "Case-Sensitiv" für die Beachtung von Groß/Klein-
schreibung bedacht. Oder irre ich mich da gerade?
Danke für Antworten und freundliche Grüße
Christian Wallmer
Tag Christian.
ich habe da mal eine Frage bezüglich der Persistierung von
Unicode in eine MySQL-Datenbank:
Schönes Thema, an dem ich mir auch schon die Zähne ausbiss :-)
Ich habe eine HTML-Form (accept-charset="UTF-8"), mit der
ich zB folgenden String absende:
Hast du wirklich alles auf UTF-8 laufen? Ich verwende folgende Angaben:
Erste Zeile des PHP-Scripts:
header("Content-type: text/html; charset=utf-8");
Header-Zeile im HTML:
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
Und natürlich das erwähnte accept-charset="UTF-8"
im einleitenden form-Tag. Heraus kommt definitiv UTF-8. Zusätzlich verwende ich für meine Tabelle als Kollation "utf8_general_ci".
"й Дмитрий Дмитрий Дмитрий Дмитрий Дмитрий Дмитри
й Дмитрий Дмитрий Дмитрий Дмитрий Дмитрий Дмитри
Süddeutsche Länder"
Ich habe das jetzt mal getestet, es wird so, wie es da steht in meine DB eingetragen und auch von PHPmyAdmin so angezeigt, nicht der von dir erwähnte Zeichensalat.
Süddeutsche Länder"
Aha, lässt du noch irgendwas anderes über den String laufen als trim()? Wie sieht denn der relevante PHP-Code aus, mittels dessen du die Formulareingaben in die DB schreibst? Ich verwende noch vor dem Speichern in der DB nach einem Tipp von dedlfix Folgendes:
$query = "SET NAMES utf8";
$result = mysql_query($query) or die("Anfrage fehlgeschlagen: " . mysql_error());
Eine Erklärung zum Thema UTF-8 und mySQL gibt's auch noch hier:
http://dev.mysql.com/tech-resources/articles/4.1/unicode.html
Siechfred
Danke Dir für die ausführliche Antwort. Werde das jetzt
mal durchgehen. Poste anschl. den (Miss)Erfolg.
Christian
Hallo Siechfred,
Super! Das mit "SET NAMES utf8" funktioniert wunderbar.
Kann das wohl evtl. bei der Online-Datenbank, die mir von 1&1
angeboten wird, zu irgendwelchen Problemen führen?
Danke.
Christian
echo $begrüßung;
Super! Das mit "SET NAMES utf8" funktioniert wunderbar.
Kann das wohl evtl. bei der Online-Datenbank, die mir von 1&1
angeboten wird, zu irgendwelchen Problemen führen?
Vermutlich ja. Soweit ich weiß hat wohl 1&1 noch kein MySQL 4.1 im Einsatz.
echo "$verabschiedung $name";
Hallo,
Kann das wohl evtl. bei der Online-Datenbank, die mir von 1&1
angeboten wird, zu irgendwelchen Problemen führen?Vermutlich ja. Soweit ich weiß hat wohl 1&1 noch kein MySQL 4.1 im Einsatz.
=>4.0.25
So ein Mist aber auch.
Und wie es sich anhört, gibt es wohl auch
kein Repräsentant für die Version?
Danke.
Christian Wallmer
echo $begrüßung;
Und wie es sich anhört, gibt es wohl auch kein Repräsentant für die Version?
Ein was bitte?
MySQL in einer Version kleiner als 4.1 hat kein Problem damit, Daten zu speichern, die beispielsweise in UTF-8 kodiert sind. Allerdings kannst du dann keine korrekte Sortierung und andere Stringbehandlung erwarten. Nur "reines" Datenlesen und -schreiben solltest du der DB dann zumuten.
echo "$verabschiedung $name";
Hallo dedlfix,
danke erstmal für deine Bemühungen.
Aber irgendwie ist da bei mir der Wurm drin. Ich habe so langsam
alle Variationen durchprobiert. Es ist zum verrückt werden.
Das Beispiel von http://dev.mysql.com/tech-resources/articles/4.1/unicode.html
habe ich auch bereits getestet, ohne Erfolg. Ich verstehe einfach
nicht, was und wo man _noch_ was einstellen kann.
Denn folgende Stellen werden bei mir nun bereits berücksichtigt:
1. der header()-Aufruf am Seitenanfang,
2. der META-Parameter
3. Die HMTL-Form
4. Die DB
5. Die Tabelle
6. Die Spalte
Fällt Dir noch etwas ein, was mein Leid mindern könnte?
;)
Danke.
Christian Wallmer
echo $begrüßung;
Fällt Dir noch etwas ein, was mein Leid mindern könnte?
Ein typischer Anfängerfehler ist es, zu glauben, wenn man einen französchen Text in einen Briefumschlag steckt, auf den man "Englisch" schreibt, erhielte man einen englischen Text. Oder mit anderen Worten: Die Angabe der Zeichenkodierung muss natürlich auch mit der tatsächlich verwendeten Kodierung übereinstimmen. Man muss sich an jeder Stelle des Prozesses klar sein, welche Kodierung gerade vorliegt und wie man die Kodierungen gegebenenfalls umwandelt.
Ob diese Problematik bei dir zutrifft kann ich als Außenstehender nicht sagen.
echo "$verabschiedung $name";
Moin!
Nun würde ich gerne mal von einem Fachmann wissen wolle
Das Auslesen des Datensatz klappt auch wunderbar. Scheint
ja alles so weit OK zu sein; doch wundert es mich
ein wenig, dass ich die Daten so nicht mehr lesen kann
(zB mit PhpMyAdmin) (da unleserlich) bzw. mir das dort
oben zudem nicht wirklich wie Unicode ausschaut.
Im Quelltext des HTML meines PhpMyAdmin fand ich:
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
mein Webserver sendet laut wget -d ein:
Content-Type: text/html; charset=iso-8859-1
Du musst das also den gewählten Zeichensatz schon sauber durchhalten um das zu sehen, was Du zu sehen wünschts: Denn wenn Du UTF-8 sendest, aber ohne konvertierung *) als ISO8859-1 anzeigen lässt kommt zwangsläufig Murks raus.
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix®
hi,
Im Quelltext des HTML meines PhpMyAdmin fand ich:
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
Also bei mir ist das schon auf utf-8 gestellt:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Gibt es evtl. noch andere Stellen?
mfg
Christian Wallmer
Moin!
ein
gibt Dir u.a. Auskunft, was Dein Server im response-header sendet. Das wird vom Browser beachtet, die meta- Angabe nur, wenn es keinen response-header gibt.
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix®
hi,
Das Auslesen des Datensatz klappt auch wunderbar. Scheint
ja alles so weit OK zu sein; doch wundert es mich
ein wenig, dass ich die Daten so nicht mehr lesen kann
(zB mit PhpMyAdmin) (da unleserlich) bzw. mir das dort
oben zudem nicht wirklich wie Unicode ausschaut.
Hast du den PMA denn auch auf utf-8 eingestellt?
(Auswahl-Selectfeld findest du auf der Startseite, utf-8 geht aber erst ab bestimmter Version.)
Warum bietet mir MySQL bei den SpaltenTypen für UTF8 lediglich
die Reihe der "Case-Insensitiven" an? So weit ich weiß ist doch
eigentlich "Case-Sensitiv" für die Beachtung von Groß/Klein-
schreibung bedacht.
Ja, stimmt - das hat allerdings nur beim suchen/sortieren Bedeutung - wenn du die Daten wieder ausliest und anzeigen lässt, ist die Groß-/Kleinschreibung selbstverständlich noch so, wie beim einfügen.
Dass MySQL dir da nur _ci anbietet, könnte am Spaltentyp liegen - die TEXT-Typen sind per Default case insensitive; wenn du case sensitivity haben möchtest, nutze statt eines TEXT- einen der BLOB-Typen. Die case (in)sensitivity ist m.W. der absolut einzige Unterschied zw. TEXT und BLOB.
gruß,
wahsaga
Hi,
Hast du den PMA denn auch auf utf-8 eingestellt?
(Auswahl-Selectfeld findest du auf der Startseite, utf-8 geht aber erst ab bestimmter Version.)
Ja, dort ist folgendes eingestellt:
Language: English(en-utf-8)
Charset: UTF8 - Unicode
Collation: utf8_general_ci
Glaubst Du, dass es am PMA liegt, oder eher an den Daten?
Ja, stimmt - das hat allerdings nur beim suchen/sortieren Bedeutung - wenn du die Daten wieder ausliest und anzeigen lässt, ist die Groß-/Kleinschreibung selbstverständlich noch so, wie beim einfügen.
Dass MySQL dir da nur _ci anbietet, könnte am Spaltentyp liegen - die TEXT-Typen sind per Default case insensitive; wenn du case sensitivity haben möchtest, nutze statt eines TEXT- einen der BLOB-Typen. Die case (in)sensitivity ist m.W. der absolut einzige Unterschied zw. TEXT und BLOB.
Super. Danke.
Chr. W.
echo $begrüßung;
Nun würde ich gerne mal von einem Fachmann wissen wollen,
ob das auf diese Art und Weise korrekt vonstatten geht?
Ich vermute, dass du die Kodierung zwischen Client und Server nicht festgelegt hast und diese nun auf latin1 (ISO-8859-1) läuft.
Es gibt im MySQL ein Haupt-Kapitel, dass sich mit der Zeichensatz-Problematik beschäftigt: Chapter 10. Character Set Support. Eine kurze Zusammenfassung dieses Themas hab ich erst neulich gegeben.
echo "$verabschiedung $name";