Met behulp van SET CHARACTER SET utf8
na gebruik van SET NAMES utf8
zal daadwerkelijk de character_set_connection
. resetten en collation_connection
naar@@character_set_database
en @@collation_database
respectievelijk.
De handleiding stelt dat
-
SET NAMES x
is gelijk aanSET character_set_client = x; SET character_set_results = x; SET character_set_connection = x;
-
en
SET CHARACTER SET x
is gelijk aanSET character_set_client = x; SET character_set_results = x; SET collation_connection = @@collation_database;
overwegende dat SET collation_connection = x
voert ook intern SET character_set_connection = <<character_set_of_collation_x>>
uit en SET character_set_connection = x
voert intern ook SET collation_connection = <<default_collation_of_character_set_x
uit .
Dus in wezen reset je character_set_connection
naar @@character_set_database
en collation_connection
naar @@collation_database
. De handleiding legt het gebruik van deze variabelen uit:
Om dit samen te vatten, de coderings-/transcoderingsprocedure die MySQL gebruikt om de query en de resultaten ervan te verwerken, bestaat uit meerdere stappen:
- MySQL behandelt de binnenkomende query als gecodeerd in
character_set_client
. - MySQL transcodeert de instructie van
character_set_client
incharacter_set_connection
- bij het vergelijken van tekenreekswaarden met kolomwaarden transcodeert MySQL de tekenreekswaarde van
character_set_connection
in de tekenset van de gegeven databasekolom en gebruikt de kolomsortering om te sorteren en te vergelijken. - MySQL bouwt de resultatenset op die is gecodeerd in
character_set_results
(dit omvat zowel resultaatgegevens als resultaatmetagegevens zoals kolomnamen enzovoort)
Het kan dus zo zijn dat een SET CHARACTER SET utf8
zou niet voldoende zijn om volledige UTF-8-ondersteuning te bieden. Denk aan een standaard database-tekenset van latin1
en kolommen gedefinieerd met utf8
-charset en doorloop de hierboven beschreven stappen. Als latin1
kan niet alle karakters bedekken die UTF-8 kan bedekken u kunt karakterinformatie verliezen in stap 3 .
- Stap 3 : Aangezien uw zoekopdracht is gecodeerd in UTF-8 en tekens bevat die niet kunnen worden weergegeven met
latin1
, gaan deze tekens verloren bij transcodering vanutf8
naarlatin1
(de standaard tekenset voor de database) waardoor uw zoekopdracht mislukt.
Dus ik denk dat het veilig is om te zeggen dat SET NAMES ...
is de juiste manier om problemen met tekensets op te lossen. Ook al zou ik dat kunnen toevoegen door je MySQL-servervariabelen correct in te stellen (alle vereiste variabelen kunnen statisch worden ingesteld in je my.cnf
) bevrijdt u van de prestatieoverhead van de extra query die nodig is bij elke verbinding.