Hi!
- Zwischen zwei Systemen muss Klarheit über die zu verwendende Kodierung herrschen.
Ein handle hat hinsichtlich der Zeichenübertragung transparent zu sein. D.h., ich übergebe einen bitstream C3.A4 und erwarte, dass am anderen Ende ebenfalls C3.A4 wieder rauskommt. Es mag sein, dass PHP oder Du das anders sieht, aber ich sehe das so: Ein handle hat die Inhalte nicht zu verändern, hat also mit der Codierung nichts zu schaffen. Und auch nicht mit dem Content-Type (MIME). Einem handle ist es egal, was da übertragen wird. Lediglich die Endsysteme müssen sich verständigen.
Ja, genau so ist das auch. Weder ich noch PHP noch MySQL sehen das anders. Die Daten werden über die Verbindung lediglich übertragen (auch wenn du das als Handle bezeichnest). Sie werden dabei nicht geändert. Erst der empfangende MySQL-Server wertet sie aus und macht intern irgendwas damit - für den Client ist das ja nur eine Blackbox. MySQL muss dazu wissen, welche Zeichenkodierung der Client verwendet hat. Genau das wird mit mysql_set_charset() oder SET NAMES mitgeteilt. Auch auf dem Rückweg will der Client die Daten in einer definiert kodierten Form haben. Und zwar jeder Client, wie er es gern hätte. Es können ja schließlich mehrere Anwendungen auf den gleichen Datenbestand zugreifen wollen (mit PMA und der selbst geschriebenen hat man schonmal zwei). Auch das muss in der erwähnten Form ausgehandelt werden - die Anwendungen könnten ja schließlich mut unterschiedlichen Zeichenkodierungen arbeiten wollen. Es nützt nichts, wenn die Blackbox MySQL den Datenstrom lediglich haargenauso wieder ausgeben könnte, wie er reinlief. Denn dann müssten alle Clients die selbe Kodierung verwenden. MySQL könnte die Daten nicht richtig interpretieren, was eine korrekte Stringverarbeitung unmöglich machte.
Wie auch immer, meine PHP Scripts mit MySQL Anbindung funktionieren einwandfrei, auch mit verschiedenen Charset-Encoding's und auf unterschiedlichen Plattformen/Serverkonfigurationen, solange ich das DB-Management nicht mit PMA mache.
Dann machst du irgendwas nicht richtig. Solange du nur die einzige Anwendung bist und MySQL von einer 1-Byte-Kodierung ausgeht, bekommst du die Daten auch wieder so raus, wie du sie hingegeben hast. Clients die aber gern eine andere Kodierung hätten, und dies ordentlich mitteilen, bekommen falsche Ergebnisse geliefert, weil das was deine Anwendung spricht und das was MySQL annimmt, vermutlich nicht das selbe ist (zum Beispiel: du schickst UTF-8, MySQLs Default-Konfiguration steht aber auf Latin1), und so MySQL deinen Datenstrom nicht korrekt interpretieren kann, sowie in der Folge nicht korrekt umkodieren kann. Auch intern wirst du einige Probleme haben. Vielleicht sind sie dir nur noch nicht aufgefallen.
Frag doch mal von einem Inhalt mit der Länge x, der einen Umlaut enthält, und den du deiner Meinung nach UTF-8-kodiert an MySQL gesendet hast, und der außerdem im PMA nicht richtig angezeigt wird, mit SELECT CHARACTER_LENGTH(ebendieser_wert) FROM tabelle WHERE ... ab, wieviele Zeichen MySQL zählt. Bei x+1 hast du MySQL nicht mitgeteilt, dass er UTF-8 sei. Wundere dich dann nicht, dass Sortierungen und Vergleiche nicht richtig arbeiten.
Lo!