sql >> Database >  >> RDS >> Mysql

Is SET CHARACTER SET utf8 nodig?

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 aan

    SET character_set_client = x;
    SET character_set_results = x;
    SET character_set_connection = x;
    
  • en SET CHARACTER SET x is gelijk aan

    SET 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:

  1. MySQL behandelt de binnenkomende query als gecodeerd in character_set_client .
  2. MySQL transcodeert de instructie van character_set_client in character_set_connection
  3. 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.
  4. 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 van utf8 naar latin1 (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.



  1. Dynamische SQL (EXECUTE) als voorwaarde voor IF-statement

  2. Hoe PHP te verbinden met MySQL

  3. hoe de overeenkomst tussen twee strings in MYSQL te berekenen?

  4. SQL om vrienden EN vrienden van vrienden van een gebruiker te krijgen