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 xis gelijk aanSET character_set_client = x; SET character_set_results = x; SET character_set_connection = x; -
en
SET CHARACTER SET xis 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_clientincharacter_set_connection - bij het vergelijken van tekenreekswaarden met kolomwaarden transcodeert MySQL de tekenreekswaarde van
character_set_connectionin 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 vanutf8naarlatin1(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.