sql >> Database teknologi >  >> RDS >> Mysql

Er SET CHARACTER SET utf8 nødvendigt?

Brug af SET CHARACTER SET utf8 efter at have brugt SET NAMES utf8 vil faktisk nulstille character_set_connection og collation_connection til
@@character_set_database og @@collation_database hhv.

manualen anfører, at

  • SET NAMES x svarer til

    SET character_set_client = x;
    SET character_set_results = x;
    SET character_set_connection = x;
    
  • og SET CHARACTER SET x svarer til

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

hvorimod SET collation_connection = x udfører også internt SET character_set_connection = <<character_set_of_collation_x>> og SET character_set_connection = x internt udfører også SET collation_connection = <<default_collation_of_character_set_x .

Så grundlæggende nulstiller du character_set_connection til @@character_set_database og collation_connection til @@collation_database . Manualen forklarer brugen af ​​disse variabler:

For at opsummere dette, er kodnings-/omkodningsproceduren, som MySQL bruger til at behandle forespørgslen, og dens resultater er en ting i flere trin:

  1. MySQL behandler den indgående forespørgsel som værende kodet i character_set_client .
  2. MySQL omkoder sætningen fra character_set_client ind i character_set_connection
  3. når man sammenligner strengværdier med kolonneværdier, omkoder MySQL strengværdien fra character_set_connection ind i tegnsættet i den givne databasekolonne og bruger kolonnesorteringen til at sortere og sammenligne.
  4. MySQL opbygger resultatsættet kodet i character_set_results (dette inkluderer resultatdata såvel som resultatmetadata såsom kolonnenavne og så videre)

Så det kunne være tilfældet, at et SET CHARACTER SET utf8 ville ikke være tilstrækkeligt til at give fuld UTF-8-understøttelse. Tænk på et standarddatabasetegnsæt latin1 og kolonner defineret med utf8 -charset og gå gennem trinene beskrevet ovenfor. Som latin1 ikke kan dække alle de tegn, som UTF-8 kan dække, kan du miste karakteroplysninger i trin 3 .

  • Trin 3 : Da din forespørgsel er kodet i UTF-8 og indeholder tegn, der ikke kan repræsenteres med latin1 , vil disse tegn gå tabt ved omkodning fra utf8 til latin1 (standarddatabasens tegnsæt), hvilket får din forespørgsel til at mislykkes.

Så jeg tror, ​​det er sikkert at sige, at SET NAMES ... er den korrekte måde at håndtere tegnsætproblemer på. Selvom jeg måske tilføjer, at opsætning af dine MySQL-servervariabler korrekt (alle de nødvendige variabler kan indstilles statisk i din my.cnf ) frigør dig fra ydeevneoverhead for den ekstra forespørgsel, der kræves ved hver forbindelse.



  1. mysql TIME_WAIT; for mange forbindelser problem

  2. SQLite - Slip en tabel

  3. Sådan starter parallelle planer - del 4

  4. MySQL vælg rækker, hvor venstre join er nul