Se hai mai lavorato con MySQL, ti sei inevitabilmente imbattuto in set di caratteri e regole di confronto. In questo post del blog, cercheremo di darti uno sguardo più approfondito su cosa sono questi due e come dovresti usarli.
Cosa sono i set di caratteri e le regole di confronto?
In parole povere, i set di caratteri in MySQL sono insiemi di simboli e codifiche - le regole di confronto sono insiemi di regole per confrontare i caratteri in un set di caratteri. In altre parole, i set di caratteri sono insiemi di caratteri validi in una stringa, mentre le regole di confronto sono un insieme di regole utilizzate per confrontare i caratteri in un determinato set di caratteri. Proprio come ogni set di caratteri ha regole di confronto predefinite, anche i set di caratteri possono avere più regole di confronto. MySQL ha un set di caratteri e regole di confronto predefiniti per il server e anche per ogni database e tabella.
Set di caratteri in MySQL
In generale, i set di caratteri in MySQL funzionano in questo modo:
- Quando viene creato un database, i set di caratteri vengono derivati dalla variabile del server_set_di caratteri a livello di server.
- Quando viene creata una tabella, i set di caratteri vengono derivati dal database.
- Quando viene creata una colonna, i set di caratteri vengono derivati dalla tabella.
Per quanto riguarda i set di caratteri, ci sono alcune variabili da tenere d'occhio:
- Character_set_client definisce il set di caratteri in cui le istruzioni vengono inviate dal client.
- Character_set_connection definisce il set di caratteri in cui vengono tradotte le istruzioni dopo che un server ha ricevuto una dichiarazione dal client.
- Character_set_results definisce il set di caratteri in cui il server restituisce i risultati della query al client.
Queste tre impostazioni possono essere modificate utilizzando le istruzioni SET NAMES o SET CHARACTER SET, o anche nei file di configurazione di MySQL.
Quando si tratta di set di caratteri a volte potresti anche riscontrare un errore #1267:
ERROR 1267 (HY000): Illegal mix of collations.
L'errore sopra è generalmente causato dal confronto di due stringhe con regole di confronto incompatibili o dal tentativo di selezionare dati con regole di confronto diverse in una colonna combinata. L'errore viene mostrato perché quando MySQL confronta due valori con set di caratteri diversi, deve convertirli nello stesso set di caratteri per il confronto, ma i set di caratteri non sono compatibili. Per risolvere questo problema, assicurati che le regole di confronto di ogni tabella e delle relative colonne siano le stesse.
Confrontazioni in MySQL
Come già accennato in precedenza, le regole di confronto sono strettamente correlate ai set di caratteri perché un confronto è un insieme di regole che definisce come confrontare e ordinare le stringhe di caratteri. Ogni set di caratteri ha almeno un confronto, alcuni ne hanno anche di più.
Anche se in questo post del blog non entreremo nei dettagli nitidi di tutte le cose relative alle regole di confronto in MySQL, ci sono alcune cose che dovresti sapere:
- Se stai usando MySQL 5.7, le regole di confronto MySQL predefinite sono generalmente latin1_swedish_ci perché MySQL usa latin1 come set di caratteri predefinito. Se stai usando MySQL 8.0, il set di caratteri predefinito è utf8mb4.
- Se scegli di utilizzare UTF-8 come confronto, usa sempre utf8mb4 (in particolare utf8mb4_unicode_ci). Non dovresti usare UTF-8 perché UTF-8 di MySQL è diverso dalla corretta codifica UTF-8. Questo è il caso perché non offre il supporto unicode completo che può portare a perdita di dati o problemi di sicurezza. Tieni presente che utf8mb4_general_ci è un insieme semplificato di regole di ordinamento che accetta scorciatoie progettate per migliorare la velocità mentre utf8mb4_unicode_ci ordina accuratamente in un'ampia gamma di lingue. In generale, utf8mb4 è il set di caratteri "più sicuro" in quanto supporta anche Unicode a 4 byte mentre utf8 ne supporta solo fino a 3.
Scelta di un buon set di caratteri e confronto
Per scegliere una buona raccolta e un buon set di caratteri per il tuo set di dati MySQL, ricorda di mantenerlo semplice. Un misto di diversi set di caratteri e (o) confronti può essere un vero pasticcio poiché possono creare molta confusione (ad esempio, tutto potrebbe funzionare bene fino alla comparsa di determinati personaggi, ecc.), quindi è meglio valutare le tue esigenze in anticipo e scegliere il migliore confronto e set di caratteri in anticipo. MySQL ha anche alcune preziose query che possono aiutarti a fare proprio questo, ad esempio
SELECT * FROM information_schema.CHARACTER_SETS ORDER BY CHARACTER_SET_NAME;
restituirebbe un elenco di set di caratteri e regole di confronto disponibili insieme alla loro descrizione che può essere estremamente utile se stai pianificando la progettazione del tuo database.
Tieni presente che alcuni set di caratteri potrebbero richiedere più operazioni della CPU, inoltre potrebbero consumare più spazio di archiviazione. L'uso di set di caratteri errati può persino sconfiggere l'indicizzazione:ad esempio, MySQL deve convertire i set di caratteri in modo da poterli confrontare quando non sono gli stessi:la conversione potrebbe rendere impossibile l'utilizzo di un indice.
Inoltre, tieni presente che alcune persone consigliano di "usare solo UTF-8 a livello globale" - questa potrebbe non essere necessariamente una buona idea perché molte applicazioni non hanno nemmeno bisogno di UTF-8 e, a seconda sui tuoi dati, UTF-8 può causare più problemi di quanti ne valga la pena (ad esempio, potrebbe utilizzare molto più spazio di archiviazione sul disco), quindi scegli con saggezza.
Riepilogo
I set di personaggi e le raccolte possono essere i tuoi amici o uno dei tuoi incubi:tutto dipende da come li usi. In generale, tieni presente che un set di caratteri e regole di confronto "buoni" dipendono dai dati che contiene il tuo database:MySQL fornisce alcune query per aiutarti a decidere cosa usare, ma affinché i tuoi set di caratteri e regole di confronto siano efficaci dovresti anche pensare su quando ha senso utilizzare un determinato confronto e perché.