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 aSET character_set_client = x; SET character_set_results = x; SET character_set_connection = x;
-
e
SET CHARACTER SET x
è equivalente aSET 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:
- MySQL considera la query in arrivo come codificata in
character_set_client
. - MySQL transcodifica l'istruzione da
character_set_client
incharacter_set_connection
- 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. - 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 dautf8
alatin1
(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.