sql >> Databasteknik >  >> RDS >> Mysql

Är SET CHARACTER SET utf8 nödvändigt?

Använd SET CHARACTER SET utf8 efter att ha använt SET NAMES utf8 kommer faktiskt att återställa character_set_connection och collation_connection till
@@character_set_database och @@collation_database respektive.

manualen uppger att

  • SET NAMES x motsvarar

    SET character_set_client = x;
    SET character_set_results = x;
    SET character_set_connection = x;
    
  • och SET CHARACTER SET x motsvarar

    SET character_set_client = x;
    SET character_set_results = x;
    SET collation_connection = @@collation_database;
    

medan SET collation_connection = x exekverar även internt SET character_set_connection = <<character_set_of_collation_x>> och SET character_set_connection = x internt kör också SET collation_connection = <<default_collation_of_character_set_x .

Så i huvudsak återställer du character_set_connection till @@character_set_database och collation_connection till @@collation_database . Manualen förklarar användningen av dessa variabler:

För att sammanfatta detta är kodnings-/omkodningsproceduren som MySQL använder för att bearbeta frågan och dess resultat en sak i flera steg:

  1. MySQL behandlar den inkommande frågan som kodad i character_set_client .
  2. MySQL omkodar satsen från character_set_client till character_set_connection
  3. när man jämför strängvärden med kolumnvärden omkodar MySQL strängvärdet från character_set_connection in i teckenuppsättningen för den givna databaskolumnen och använder kolumnsorteringen för att sortera och jämföra.
  4. MySQL bygger upp resultatuppsättningen kodad i character_set_results (detta inkluderar resultatdata såväl som resultatmetadata som kolumnnamn och så vidare)

Så det kan vara så att en SET CHARACTER SET utf8 skulle inte vara tillräckligt för att ge fullt UTF-8-stöd. Tänk på en standarddatabasteckenuppsättning latin1 och kolumner definierade med utf8 -charset och gå igenom stegen som beskrivs ovan. Som latin1 inte kan täcka alla tecken som UTF-8 kan täcka kan du förlora teckeninformation i steg 3 .

  • Steg 3 : Med tanke på att din fråga är kodad i UTF-8 och innehåller tecken som inte kan representeras med latin1 , kommer dessa tecken att gå förlorade vid omkodning från utf8 till latin1 (standarddatabasteckenuppsättningen) vilket gör att din fråga misslyckas.

Så jag tror att det är säkert att säga att SET NAMES ... är det korrekta sättet att hantera teckenuppsättningsproblem. Även om jag kan tillägga att du ställer in dina MySQL-servervariabler korrekt (alla nödvändiga variabler kan ställas in statiskt i din my.cnf ) befriar dig från prestandaoverheaden för den extra fråga som krävs vid varje anslutning.



  1. Driver.getConnection hänger sig med SQLServer-drivrutinen och Java 1.6.0_29

  2. Hur kan jag uppdatera/öppna en SQLite-databas efter att ha återställt den, när jag använder en singleton för databashjälpen

  3. Ställa in Oracle-språkparametrar för DG4ODBC

  4. Google BigQuery ODBC-drivrutin