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

Qual è la differenza tra utf8_general_ci e utf8_unicode_ci?

Per coloro che continuano a rispondere a questa domanda nel 2020 o dopo, ci sono nuove opzioni che potrebbero essere migliori di entrambe di questi. Ad esempio, utf8mb4_0900_ai_ci .

Tutte queste regole di confronto sono per la codifica dei caratteri UTF-8. Le differenze riguardano il modo in cui il testo viene ordinato e confrontato.

_unicode_ci e _general_ci sono due diversi insiemi di regole per ordinare e confrontare il testo in base al modo in cui ci si aspetta. Le versioni più recenti di MySQL introducono anche nuovi set di regole, come _0900_ai_ci per regole equivalenti basate su Unicode 9.0 - e senza _general_ci equivalente variante. Le persone che stanno leggendo questo ora dovrebbero probabilmente usare una di queste nuove regole di confronto invece di _unicode_ci o _general_ci . La descrizione di queste precedenti regole di confronto di seguito viene fornita solo a scopo di interesse.

MySQL sta attualmente passando da una vecchia implementazione UTF-8 difettosa. Per ora, devi usare utf8mb4 invece di utf8 per la parte di codifica dei caratteri, per assicurarti di ottenere la versione fissa. La versione difettosa rimane per compatibilità con le versioni precedenti, sebbene sia stata deprecata.

Differenze principali

  • utf8mb4_unicode_ci si basa sulle regole ufficiali Unicode per l'ordinamento e il confronto universali, che ordina accuratamente in un'ampia gamma di lingue.

  • utf8mb4_general_ci è un insieme semplificato di regole di ordinamento che mira a fare il meglio che può, prendendo molte scorciatoie progettate per migliorare la velocità. Non segue le regole Unicode e comporterà un ordinamento o un confronto indesiderato in alcune situazioni, ad esempio quando si utilizzano lingue o caratteri particolari.

    Sui server moderni, questo aumento delle prestazioni sarà quasi trascurabile. È stato concepito in un'epoca in cui i server avevano una piccola parte delle prestazioni della CPU dei computer odierni.

Vantaggi di utf8mb4_unicode_ci su utf8mb4_general_ci

utf8mb4_unicode_ci , che utilizza le regole Unicode per l'ordinamento e il confronto, impiega un algoritmo abbastanza complesso per l'ordinamento corretto in un'ampia gamma di lingue e quando si utilizza un'ampia gamma di caratteri speciali. Queste regole devono tenere conto delle convenzioni linguistiche; non tutti ordinano i propri caratteri in quello che chiameremmo 'ordine alfabetico'.

Per quanto riguarda le lingue latine (cioè "europee"), non c'è molta differenza tra l'ordinamento Unicode e il semplificato utf8mb4_general_ci ordinamento in MySQL, ma ci sono ancora alcune differenze:

  • Ad esempio, le regole di confronto Unicode ordinano "ß" come "ss" e "Œ" come "OE" come farebbero normalmente le persone che usano quei caratteri, mentre utf8mb4_general_ci li ordina come caratteri singoli (presumibilmente come "s" ed "e" rispettivamente).

  • Alcuni caratteri Unicode sono definiti come ignorabili, il che significa che non dovrebbero essere conteggiati nell'ordinamento e il confronto dovrebbe invece passare al carattere successivo. utf8mb4_unicode_ci li gestisce correttamente.

Nelle lingue non latine, come le lingue asiatiche o le lingue con alfabeti diversi, potrebbero essercene molte di più differenze tra l'ordinamento Unicode e il utf8mb4_general_ci semplificato ordinamento. L'idoneità di utf8mb4_general_ci dipenderà molto dalla lingua utilizzata. Per alcune lingue sarà abbastanza inadeguato.

Cosa dovresti usare?

Non c'è quasi certamente alcun motivo per usare utf8mb4_general_ci più, poiché abbiamo lasciato il punto in cui la velocità della CPU è abbastanza bassa da rendere importante la differenza di prestazioni. Il tuo database sarà quasi sicuramente limitato da colli di bottiglia diversi da questo.

In passato, alcune persone consigliavano di utilizzare utf8mb4_general_ci tranne quando uno smistamento accurato sarebbe stato abbastanza importante da giustificare il costo delle prestazioni. Oggi, il costo delle prestazioni è quasi scomparso e gli sviluppatori stanno trattando l'internazionalizzazione in modo più serio.

C'è un argomento da sostenere che se la velocità è più importante per te della precisione, potresti anche non eseguire alcun ordinamento. È banale rendere più veloce un algoritmo se non è necessario che sia accurato. Quindi, utf8mb4_general_ci è un compromesso che probabilmente non è necessario per motivi di velocità e probabilmente non adatto anche per motivi di precisione.

Un'altra cosa che aggiungo è che anche se sai che la tua applicazione supporta solo la lingua inglese, potrebbe comunque aver bisogno di gestire i nomi delle persone, che spesso possono contenere caratteri usati in altre lingue in cui è altrettanto importante ordinare correttamente . L'uso delle regole Unicode per tutto aiuta ad aggiungere tranquillità al fatto che le persone Unicode molto intelligenti hanno lavorato molto duramente per far funzionare correttamente l'ordinamento.

Cosa significano le parti

Innanzitutto, ci è per senza distinzione tra maiuscole e minuscole ordinamento e confronto. Ciò significa che è adatto per dati testuali e il caso non è importante. Gli altri tipi di confronto sono cs (case-sensitive) per i dati testuali in cui le maiuscole sono importanti e bin , per dove la codifica deve corrispondere, bit per bit, che è adatto per campi che sono dati binari realmente codificati (incluso, ad esempio, Base64). L'ordinamento con distinzione tra maiuscole e minuscole porta a risultati strani e il confronto con distinzione tra maiuscole e minuscole può comportare valori duplicati che differiscono solo in lettere maiuscole, quindi le regole di confronto con distinzione tra maiuscole e minuscole stanno cadendo in disgrazia per i dati testuali:se le maiuscole sono significative per te, altrimenti la punteggiatura ignorabile e così via è probabilmente anche significativo e un confronto binario potrebbe essere più appropriato.

Quindi, unicode o general si riferisce alle regole di ordinamento e confronto specifiche, in particolare al modo in cui il testo viene normalizzato o confrontato. Ci sono molti diversi insiemi di regole per la codifica dei caratteri utf8mb4, con unicode e general essendo due che tentano di funzionare bene in tutte le lingue possibili piuttosto che in una specifica. Le differenze tra questi due insiemi di regole sono l'oggetto di questa risposta. Nota che unicode utilizza le regole di Unicode 4.0. Le versioni recenti di MySQL aggiungono i set di regole unicode_520 utilizzando le regole di Unicode 5.2 e 0900 (eliminando la parte "unicode_") usando le regole di Unicode 9.0.

E infine, utf8mb4 è ovviamente la codifica dei caratteri utilizzata internamente. In questa risposta sto parlando solo di codifiche basate su Unicode.