Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
[MySQL+PHP] UTF-8 Darstellungsproblem
View unanswered posts
View posts from last 24 hours
View posts from last 7 days

 
Reply to topic    Gentoo Forums Forum Index Deutsches Forum (German)
View previous topic :: View next topic  
Author Message
Finswimmer
Moderator
Moderator


Joined: 02 Sep 2004
Posts: 5467
Location: Langen (Hessen), Germany

PostPosted: Wed Dec 08, 2010 6:28 am    Post subject: [MySQL+PHP] UTF-8 Darstellungsproblem Reply with quote

Hallo,

ich habe eine Datenbankoberfläche in PHP geschrieben. Diese hat im Header das Encoding auf UTF-8 gestellt.
Die betreffende Tabelle hat utf8_general_ci als Kollation.
Gebe ich nun über die Oberfläche Umlaute ein, werden diese wieder korrekt angezeigt. Aber in der Datenbank sieht es dann so aus:
üöä
Gebe ich in der Datenbank "üöä" ein, so erhalte ich ��� in der Oberfläche.

Zugegeben, es wird selten vorkommen, dass ich direkt auf PhpMyAdmin exportiere, aber wenn, dann sollten dort die Daten korrekt sein.

# MySQL-Zeichensatz: UTF-8 Unicode (utf8)
#
Zeichensatz / Kollation der MySQL-Verbindung: utf8-unicode-ci

Getestet habe ich das sowohl auf meinem Gentoo-Rechner als auch auf dem Produktiv-System, welches eine Debian-Abart ist.

Kennt jemand das Problem?

Danke
Tobi
_________________
Bitte auf Rechtschreibung, korrekte Formatierung und Höflichkeit achten!
Danke
Back to top
View user's profile Send private message
Christian99
Veteran
Veteran


Joined: 28 May 2009
Posts: 1176

PostPosted: Wed Dec 08, 2010 9:18 am    Post subject: Reply with quote

Hi, bei mir geht das.
So als erste Ideen: überprüf doch mal, ob dein Browser wirklich das eingestellte charset verwendet. Ist mir schon mal passiert, dass aufgrung eines tippfehlers das nicht verwendet wurde.
man kann auch jeder einzelnen tabelle und jedem einzelnen textfeld eine kollation einstellen. stehen die auch auf UTF?

Christian
Back to top
View user's profile Send private message
py-ro
Veteran
Veteran


Joined: 24 Sep 2002
Posts: 1733
Location: St. Wendel

PostPosted: Wed Dec 08, 2010 12:36 pm    Post subject: Reply with quote

Es ist übrigens im Prinzip egal welche Collation für die Tabelle eingegeben ist, wenn der Client und der Server den Charset richtig miteinander aushandeln, MySQL macht es dann implizit korrekt.

Versuche mal Testweise als erste Abfrage an die Datenbank in deinem PHP-Skript folgendes:

Code:
SET NAMES 'utf-8'


oder

Code:
SET NAMES 'latin1'


Frei aus dem Gedächtnis. PHP handelt das manchmal 'seltsam' aus.

Bye
Py
Back to top
View user's profile Send private message
Finswimmer
Moderator
Moderator


Joined: 02 Sep 2004
Posts: 5467
Location: Langen (Hessen), Germany

PostPosted: Wed Dec 08, 2010 9:07 pm    Post subject: Reply with quote

Danke :)
Das hat mich auf den richtigen Trichter gebracht.
Von SET NAMES 'utf8' wurde irgendwo abgeraten, aber
mysql_set_charset('utf8');
funktioniert prächtig

Vielen Dank
Tobi
_________________
Bitte auf Rechtschreibung, korrekte Formatierung und Höflichkeit achten!
Danke
Back to top
View user's profile Send private message
Finswimmer
Moderator
Moderator


Joined: 02 Sep 2004
Posts: 5467
Location: Langen (Hessen), Germany

PostPosted: Wed Dec 08, 2010 9:45 pm    Post subject: Reply with quote

Leider funktioniert es nur bei neu eingegebenen Daten.
Die alten Daten sehen jetzt so aus:
- fehlende Einstellung auf Persönlichkeit
beobachten können
erhöht Herausforderung

Leider weiß ich nicht, wie ich das mit MySQL und Convert/Cast in UTF-8 bekomme.
Latin1 scheint es nicht zu sein.
Wie kann ich das denn herausfinden?

Danke
Tobi
_________________
Bitte auf Rechtschreibung, korrekte Formatierung und Höflichkeit achten!
Danke
Back to top
View user's profile Send private message
b3cks
Veteran
Veteran


Joined: 23 Mar 2004
Posts: 1481
Location: Bremen (GER)

PostPosted: Wed Dec 08, 2010 11:15 pm    Post subject: Reply with quote

DB aus MySQL exportieren > mittels (beispielsweise) iconv nach UTF-8 konvertieren > Dump wieder in MySQL importieren
_________________
I am /root and if you see me laughing you better have a backup.
Back to top
View user's profile Send private message
Finswimmer
Moderator
Moderator


Joined: 02 Sep 2004
Posts: 5467
Location: Langen (Hessen), Germany

PostPosted: Thu Dec 09, 2010 6:45 am    Post subject: Reply with quote

iconv -f ISO8859-1 -t UTF-8 old.sql > new.sql
iconv -f CP1252 -t UTF-8 old.sql > new.sql

führen beide leider nicht zum gewünschten Erfolg.

Vorher ist die Datei aber laut file schon UTF-8:
old.sql: UTF-8 Unicode English text, with very long lines

Ich habe die resultierende Datei auch im Firefox geöffnet und die Standard-Encodings durchgetestet.
Weder mit ISO-8859-1/-15, Windows-1252, UTF-8 kann ich die Umlaute richtig angezeigt bekommen.

Die alte DB hatte als Kollation latin1_swedish_ci, und latin1_german_ci.

Danke
Tobi
_________________
Bitte auf Rechtschreibung, korrekte Formatierung und Höflichkeit achten!
Danke
Back to top
View user's profile Send private message
musv
Advocate
Advocate


Joined: 01 Dec 2002
Posts: 3254
Location: de

PostPosted: Thu Dec 09, 2010 9:47 am    Post subject: Reply with quote

Ich denke, du musst konsequent UTF-8 benutzen:

Gentoo: locale UTF-8
PHP: UTF-8
HTML-Header Encoding: UTF-8
MySQL Kollation: UTF-8

In PHP konntest du sowas auch irgendwo angeben beim Zugriff auf MySQL.
http://de3.php.net/manual/de/mysqli.set-charset.php
http://de3.php.net/manual/de/mysqli.character-set-name.php

Zumindest waren bei mir dann diese Probleme weg. Aber wenn schon die Kodierung der SQL-Datei falsch angezeigt wird, ist da schon der Wurm drin. Erzeugt phpmyadmin ebenfalls falsche Umlaute?
Back to top
View user's profile Send private message
Finswimmer
Moderator
Moderator


Joined: 02 Sep 2004
Posts: 5467
Location: Langen (Hessen), Germany

PostPosted: Fri Dec 10, 2010 6:32 pm    Post subject: Reply with quote

Hi,

ich habe herausgefunden, dass utf8_decode (php Funktion), die alten Umlaute richtig anzeigt:

alt:
trotz jüngerem Alters: --> utf8_decode --> trotz jüngerem Alters:

neu eingegeben:
üöä --> utf8_decode --> ���

Die Funktion macht folgendes:
Diese Funktion dekodiert Daten (data), die in UTF-8 zu sein scheinen, in ISO-8859-1.

Wie kann ich das nun machen?
_________________
Bitte auf Rechtschreibung, korrekte Formatierung und Höflichkeit achten!
Danke
Back to top
View user's profile Send private message
Christian99
Veteran
Veteran


Joined: 28 May 2009
Posts: 1176

PostPosted: Fri Dec 10, 2010 6:43 pm    Post subject: Reply with quote

hm, ich würde vermuden, dass php irgendwie standartmäßig davon ausgeht, dass strings iso 8859 sind. eventuell kann man das umstellen?
(nicht sehr hilfreich, sorry. was ich eigentlich sagen will: schau mal bei den php-einstellungen, evtl phpinfo(), ob du da was findest, dass so in der richtung aussieht.)
Back to top
View user's profile Send private message
musv
Advocate
Advocate


Joined: 01 Dec 2002
Posts: 3254
Location: de

PostPosted: Mon Dec 13, 2010 3:17 pm    Post subject: Reply with quote

utf8_decode() und utf8_encode() sind Workarounds für inkonsistente Kodierungen, d.h. irgendwas in utf8, was anderes in iso.

Die einzige wirklich brauchbare Lösung ist der konsequente Einsatz von UTF8 auf allen Etappen. Ansonsten bekommst du da nie Ruhe rein.
Back to top
View user's profile Send private message
Finswimmer
Moderator
Moderator


Joined: 02 Sep 2004
Posts: 5467
Location: Langen (Hessen), Germany

PostPosted: Mon Dec 13, 2010 5:38 pm    Post subject: Reply with quote

Hi musv,

das Problem ist, dass ich es im Moment inkonsistent habe.
Stelle ich auf UTF8 komplett um, sind die Umlaute der 50.00 Einträge komplett falsch.

Das muss ich dann irgendwie hinbekommen.

Tobi
_________________
Bitte auf Rechtschreibung, korrekte Formatierung und Höflichkeit achten!
Danke
Back to top
View user's profile Send private message
musv
Advocate
Advocate


Joined: 01 Dec 2002
Posts: 3254
Location: de

PostPosted: Mon Dec 13, 2010 8:18 pm    Post subject: Reply with quote

Finswimmer wrote:
iconv -f ISO8859-1 -t UTF-8 old.sql > new.sql
iconv -f CP1252 -t UTF-8 old.sql > new.sql

Vorher ist die Datei aber laut file schon UTF-8:
old.sql: UTF-8 Unicode English text, with very long lines

Klingt jetzt doof, aber probier mal die andere Richtung:
Code:
iconv -f UTF-8  -t ISO8859-1 old.sql  > new.sql

Und lad dann mal die Datei mit Kate oder Scite und spiel etwas mit den Kodierungen rum.
Back to top
View user's profile Send private message
LinuxTom
l33t
l33t


Joined: 26 Mar 2006
Posts: 798

PostPosted: Tue Dec 14, 2010 4:28 am    Post subject: Reply with quote

Du musst Dein System wieder auf den "alten" Zeichensatz umstellen (da reicht es oft eine laufende Shell umzustellen und von dieser aus MySQL zu starten), den Du _vor_ UTF-8 hattest. Dann alle Daten exportieren, dann MySQL (mit mysql_set_charset('utf8'); ) und auch Dein System wieder auf UTF-8 umstellen und dann das iconv auf dem Datenexport ausführen und wieder importieren. Theoretisch dann fertig. Alles Andere ist ein Mischmasch, das Deine Daten durcheinander wirft und zerhackstückelt.
Back to top
View user's profile Send private message
Finswimmer
Moderator
Moderator


Joined: 02 Sep 2004
Posts: 5467
Location: Langen (Hessen), Germany

PostPosted: Tue Dec 14, 2010 7:21 am    Post subject: Reply with quote

Ich habe an der Datenbank und dem System nichts geändert, sondern nur mysql_set_charset('utf8'); hinzugefügt.

Da ich die ganze Zeit die Daten mit utf8_decode eingegeben habe, sind sie in der Datenbank nun nicht richtig.


@LinuxTom:
Ich teste es nachher mal, aber da man mit "mysql_set_charset('utf8');" nur bei meiner Oberfläche den Zeichensatz umstellt, sehe ich schwarz, dass sich das auswirkt auf einen reinen MySQL Export direkt aus der Konsole.


Gibt es irgendwo eine Möglichkeit herauszufinden, was für ein Zeichensatz sowas ist "trotz jüngerem Alters"?

Danke
Tobi
_________________
Bitte auf Rechtschreibung, korrekte Formatierung und Höflichkeit achten!
Danke
Back to top
View user's profile Send private message
LinuxTom
l33t
l33t


Joined: 26 Mar 2006
Posts: 798

PostPosted: Tue Dec 14, 2010 7:28 am    Post subject: Reply with quote

Finswimmer wrote:
... sehe ich schwarz ...

Versuche es einfach mal, als ob Du die Zeichensätze nie umgestellt hättest. Nach dem Export zwingst Du dann MySQL auf UTF-8. das musste ich auch machen. Danach gab es keine Probleme mehr.
Back to top
View user's profile Send private message
Finswimmer
Moderator
Moderator


Joined: 02 Sep 2004
Posts: 5467
Location: Langen (Hessen), Germany

PostPosted: Tue Dec 14, 2010 6:30 pm    Post subject: Reply with quote

Nö.
Ich bekomme es einfach nicht hin.

Ab und zu habe ich es soweit, dass Firefox es sogar cp1252 richtig anzeigt.
Aber das kann es ja auch nicht sein.
_________________
Bitte auf Rechtschreibung, korrekte Formatierung und Höflichkeit achten!
Danke
Back to top
View user's profile Send private message
Josef.95
Advocate
Advocate


Joined: 03 Sep 2007
Posts: 3628
Location: Germany

PostPosted: Tue Dec 14, 2010 6:48 pm    Post subject: Reply with quote

Schau mal ob dir dies eventuell weiterhilft?!
Die Umlautproblematik - was, wieso, was tun?
Back to top
View user's profile Send private message
Finswimmer
Moderator
Moderator


Joined: 02 Sep 2004
Posts: 5467
Location: Langen (Hessen), Germany

PostPosted: Tue Dec 14, 2010 6:57 pm    Post subject: Reply with quote

Das geht nun:

export mysqldump -u -p quatras db1c_KE > db1c_KE
iconv -f utf8 -t cp1252 db1c_KE > utf8
import über mysql -u -p -Dquatras

alles bei locale=utf8

dann muss ich noch mysql_set_charset('utf8'); in meine DB-Verbindung von PHP setzen.

Total merkwürdig.
_________________
Bitte auf Rechtschreibung, korrekte Formatierung und Höflichkeit achten!
Danke
Back to top
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index Deutsches Forum (German) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum