Tach!
Ich meine, wenn man eine ganz normale Fehlerbehandlung betreibt, das Escaping stimmt, usw. Ich wäre jetzt nicht darauf gekommen, dass MySQL hier in den Datenstriom eingreift, nur weil die Codierung nicht stimmt. Wenn das Escaping passt, dürfte das die Datenbank doch eigentlich hier nicht interessieren - war mein Gedanke. Kannst Du mir erklären, mit welcher Berechtigung MySQL hier Daten verstümmelt (bitte bei ordnungsgemäßem Escaping!)?
Was würdest du tun? Irgendeinen Tod musst du bei der Sache sterben. Fakt ist, Mysql bekommt ein fehlerhaft kodiertes Statement, und da kannst du nicht erwarten, dass es fehlerfrei damit arbeiten kann. Statt Abschneiden käme lediglich noch die Ersetzung durch das "replacement character" (U+FFFD, �) in Frage mit irgendeinem anschließendem Versuch, im nachfolgenden Bytestrom wieder was Sinnvolles zu erkennen. Und das kann unter Umständen gleich zu einer Sicherheitslücke führen. Wenn es einmal aus dem Tritt gekommen ist, helfen auch keine korrekten Escape-Sequenzen, denn dann könnte man auch mittenrein treten unter der Annahme, dass das \ noch zur UTF-8-Sequenz hätte gehören sollen. Die Anzahl der Folgebytes einer UTF-8-Sequenz geht ja aus deren erstem Byte hervor.
Welche Annahme soll MySQL denn in einer solchen Situation treffen? Als global verwendbares Tool kann es nicht einfach davon ausgehen, dass das Latin1 ist. Es kann ja auch eine verfälschte Datenübertragung gewesen sein, bei der nur zufällig ein paar Bits verändert wurden oder auch Bytes verschwunden sind. Und dann kommt noch die MySQL-Philosophie ins Spiel, dass diverse Dinge einfach nicht zu streng gehandhabt werden, was sicherlich auch ein Beitrag zum Erfolg MySQLs war.
Wie auch immer, es kann mit der Nicht-UTF-8-Kodierung einfach nicht weiterarbeiten, denn der nächste Schritt kann schon eine Umkodierung zum Zwecke der Stringverarbeitung oder in die Feldkodierung sein. Damit geht dann unter Umständen auch noch das Replacement Character verloren (wird vielleicht durch ein schnödes Fragezeichen ersetzt) und man kann gleich gar nicht mehr richtig erkennen, bei welchem Schritt nun der Verlust aufgetreten ist.
dedlfix.