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

È necessario SET CHARACTER SET utf8?

Usando SET CHARACTER SET utf8 dopo aver utilizzato SET NAMES utf8 ripristinerà effettivamente il character_set_connection e collation_connection a
@@character_set_database e @@collation_database rispettivamente.

Il manuale afferma che

  • SET NAMES x è equivalente a

    SET character_set_client = x;
    SET character_set_results = x;
    SET character_set_connection = x;
    
  • e SET CHARACTER SET x è equivalente a

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

mentre SET collation_connection = x esegue anche internamente SET character_set_connection = <<character_set_of_collation_x>> e SET character_set_connection = x internamente esegue anche SET collation_connection = <<default_collation_of_character_set_x .

Quindi essenzialmente stai reimpostando character_set_connection a @@character_set_database e collation_connection a @@collation_database . Il manuale spiega l'utilizzo di queste variabili:

Per riassumere, la procedura di codifica/transcodifica utilizzata da MySQL per elaborare la query e i suoi risultati è composta da più passaggi:

  1. MySQL considera la query in arrivo come codificata in character_set_client .
  2. MySQL transcodifica l'istruzione da character_set_client in character_set_connection
  3. Quando si confrontano i valori di stringa con i valori di colonna, MySQL transcodifica il valore di stringa da character_set_connection nel set di caratteri della colonna data del database e usa le regole di confronto delle colonne per eseguire l'ordinamento e il confronto.
  4. MySQL crea il set di risultati codificato in character_set_results (questo include i dati dei risultati e i metadati dei risultati come i nomi delle colonne e così via)

Quindi potrebbe essere il caso che un SET CHARACTER SET utf8 non sarebbe sufficiente per fornire il pieno supporto UTF-8. Pensa a un set di caratteri del database predefinito di latin1 e colonne definite con utf8 -charset e segui i passaggi descritti sopra. Come latin1 non può coprire tutti i caratteri che UTF-8 può coprire, potresti perdere le informazioni sul personaggio nel passaggio 3 .

  • Passaggio 3 : Dato che la tua query è codificata in UTF-8 e contiene caratteri che non possono essere rappresentati con latin1 , questi caratteri andranno persi durante la transcodifica da utf8 a latin1 (il set di caratteri del database predefinito) che fa fallire la tua query.

Quindi penso che sia sicuro affermare che SET NAMES ... è il modo corretto per gestire i problemi relativi ai set di caratteri. Anche se potrei aggiungere che impostando correttamente le variabili del tuo server MySQL (tutte le variabili richieste possono essere impostate staticamente nel tuo my.cnf ) ti libera dal sovraccarico di prestazioni della query aggiuntiva richiesta su ogni connessione.