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 xentsprichtSET character_set_client = x; SET character_set_results = x; SET character_set_connection = x; -
und
SET CHARACTER SET xentsprichtSET 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_clientkodiert . - MySQL transcodiert die Anweisung von
character_set_clientincharacter_set_connection - beim Vergleichen von String-Werten mit Spaltenwerten transkodiert MySQL den String-Wert von
character_set_connectionin den Zeichensatz der angegebenen Datenbankspalte und verwendet die Spaltensortierung zum Sortieren und Vergleichen. - MySQL baut die Ergebnismenge kodiert in
character_set_resultsauf (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
latin1dargestellt werden können gehen diese Zeichen bei der Transcodierung vonutf8verloren 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.