Mit SET CHARACTER SET utf8
nach der Verwendung von SET NAMES utf8
wird tatsächlich die character_set_connection
zurücksetzen und collation_connection
zu@@character_set_database
und @@collation_database
bzw..
Das Handbuch besagt, dass
-
SET NAMES x
entsprichtSET character_set_client = x; SET character_set_results = x; SET character_set_connection = x;
-
und
SET CHARACTER SET x
entsprichtSET character_set_client = x; SET character_set_results = x; SET collation_connection = @@collation_database;
wohingegen SET collation_connection = x
führt auch intern SET character_set_connection = <<character_set_of_collation_x>>
aus und SET character_set_connection = x
führt intern auch SET collation_connection = <<default_collation_of_character_set_x
aus .
Im Wesentlichen setzen Sie also character_set_connection
zurück zu @@character_set_database
und collation_connection
zu @@collation_database
. Das Handbuch erklärt die Verwendung dieser Variablen:
Zusammenfassend lässt sich sagen, dass die Codierungs-/Transcodierungsprozedur, die MySQL verwendet, um die Abfrage und ihre Ergebnisse zu verarbeiten, aus mehreren Schritten besteht:
- MySQL behandelt die eingehende Abfrage als in
character_set_client
kodiert . - MySQL transcodiert die Anweisung von
character_set_client
incharacter_set_connection
- beim Vergleichen von String-Werten mit Spaltenwerten transkodiert MySQL den String-Wert von
character_set_connection
in den Zeichensatz der angegebenen Datenbankspalte und verwendet die Spaltensortierung zum Sortieren und Vergleichen. - MySQL baut die Ergebnismenge kodiert in
character_set_results
auf (Dazu gehören Ergebnisdaten sowie Ergebnismetadaten wie Spaltennamen usw.)
Es könnte also sein, dass ein SET CHARACTER SET utf8
würde nicht ausreichen, um vollständige UTF-8-Unterstützung bereitzustellen. Stellen Sie sich einen Standard-Datenbankzeichensatz von latin1
vor und mit utf8
definierte Spalten -charset und führen Sie die oben beschriebenen Schritte aus. Als latin1
kann nicht alle Zeichen abdecken, die UTF-8 abdecken kann, können Sie Zeicheninformationen in Schritt 3 verlieren .
- Schritt 3 : Da Ihre Abfrage in UTF-8 codiert ist und Zeichen enthält, die nicht mit
latin1
dargestellt werden können gehen diese Zeichen bei der Transcodierung vonutf8
verloren zulatin1
(der Standard-Zeichensatz der Datenbank), wodurch Ihre Abfrage fehlschlägt.
Ich denke also, es ist sicher zu sagen, dass SET NAMES ...
ist der richtige Weg, um mit Zeichensatzproblemen umzugehen. Auch wenn ich hinzufügen könnte, dass Sie Ihre MySQL-Servervariablen korrekt einrichten (alle erforderlichen Variablen können statisch in Ihrer my.cnf
gesetzt werden ) befreit Sie vom Leistungsaufwand der zusätzlichen Abfrage, die bei jeder Verbindung erforderlich ist.