Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Ist SET CHARACTER SET utf8 notwendig?

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 entspricht

    SET character_set_client = x;
    SET character_set_results = x;
    SET character_set_connection = x;
    
  • und SET CHARACTER SET x entspricht

    SET 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:

  1. MySQL behandelt die eingehende Abfrage als in character_set_client kodiert .
  2. MySQL transcodiert die Anweisung von character_set_client in character_set_connection
  3. 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.
  4. 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 von utf8 verloren zu latin1 (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.