dedlfix: Zwar gelöst, aber seltsame Zusammenhänge

Beitrag lesen

Hi!

mysql_query("SET NAMES 'latin1_german_ci'", $db);

SET NAMES will nur die Kodierungsinformation haben, also nur latin1. Die Anführungszeichen können entfallen. Die Kollation kann man mit der Klausel COLLATE angeben, also vollständig: SET NAMES latin1 COLLATE latin1_german_ci

$charset = mysql_client_encoding($db);
printf("MySQL Verbindungszeichensatz ist: %s\n<br />", $charset);
ergibt in der Ausgabe:
MySQL Verbindungszeichensatz ist: latin1

1267: Illegal mix of collations (latin1_german1_ci,IMPLICIT) and (latin1_swedish_ci,IMPLICIT) for operation '='

Das latin1_swedish_ci ist die Default-Einstellung. Das bedeutet, dass an irgendeiner Stelle keine explizite Angabe zur Kodierung/Kollation gemacht wurde. Dein Einfluss als Nicht-Admin erstreckt sich dabei auf deine Datenbank, die Tabellen darin und deren Felder sowie auf die Angaben zur Verbindung. Außerdem kommen noch selten benötigte individuelle Angaben wie bei CONVERT() oder String-Literalen hinzu.

mysql_query("SET NAMES 'utf8'", $db);
$charset = mysql_client_encoding($db);
printf("MySQL Verbindungszeichensatz ist: %s\n<br />", $charset);
ergibt in der Ausgabe:
MySQL Verbindungszeichensatz ist: latin1

Kein Wunder. mysql_client_encoding() befragt die Client-API. Ein SET NAMES geht aber an der Client-API vorbei und veranlasst nur den Server, sich umzustellen. mysql_client_encoding() kann dir als nicht den richtigen Wert liefern. Das kann es nur, wenn mysql_set_charset() für die Einstellung der Verbindungscodierung verwendet wurde. Diese Funktion redet mit der Client-API, die nun einerseits selbst Bescheid weiß und andererseits die Angabe an den Server übermittelt. Davon betroffen ist auch die Funktion mysql_real_escape_string(), die bei SET NAMES im Prinzip nicht richtig arbeiten kann. Allerdings hat das nur Auswirkungen auf einige asiatische Kodierungen, nicht jedoch auf latin1 und utf8.

Damit sollte nun klar sein, dass die erste Ausgabe des latin1 zufällig gestimmt hat.

und soinst keine weiter Fehlermeldung mehr!
Kann mir dazu jemand den Hintergrund erklären?

Erklärt hab ich es ja schon, nun solltest du die Stelle suchen, an der du vergessen hast, die Kodierung/Kollation selbst festzulegen.

Das MySQL-Handbuch behandelt dieses Thema übrigens im Kapitel Character Set Support.

Lo!