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 tilSET character_set_client = x; SET character_set_results = x; SET character_set_connection = x;
-
og
SET CHARACTER SET x
svarer tilSET 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:
- MySQL behandler den indgående forespørgsel som værende kodet i
character_set_client
. - MySQL omkoder sætningen fra
character_set_client
ind icharacter_set_connection
- 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. - 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 frautf8
tillatin1
(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.