Riesco a leggere la documentazione di MySQL ed è abbastanza chiaro. Ma come si decide quale set di caratteri utilizzare? Su quali dati ha effetto la raccolta?
Sto chiedendo una spiegazione dei due e come sceglierli.
Riesco a leggere la documentazione di MySQL ed è abbastanza chiaro. Ma come si decide quale set di caratteri utilizzare? Su quali dati ha effetto la raccolta?
Sto chiedendo una spiegazione dei due e come sceglierli.
Risposte:
Dai documenti MySQL :
Un set di caratteri è un set di simboli e codifiche. Una raccolta è un insieme di regole per confrontare i caratteri in un set di caratteri. Facciamo la distinzione chiara con un esempio di un set di caratteri immaginario.
Supponiamo di avere un alfabeto con quattro lettere: 'A', 'B', 'a', 'b'. Diamo a ogni lettera un numero: 'A' = 0, 'B' = 1, 'a' = 2, 'b' = 3. La lettera 'A' è un simbolo, il numero 0 è la codifica per 'A' e la combinazione di tutte e quattro le lettere e le relative codifiche è un set di caratteri.
Supponiamo ora di voler confrontare due valori di stringa, 'A' e 'B'. Il modo più semplice per farlo è guardare le codifiche: 0 per 'A' e 1 per 'B'. Poiché 0 è minore di 1, diciamo che 'A' è minore di 'B'. Ora, quello che abbiamo appena fatto è applicare una collation al nostro set di caratteri. Le regole di confronto sono un insieme di regole (in questo caso solo una regola): "confronta le codifiche". Chiamiamo questa semplice e semplice raccolta possibile una raccolta binaria.
E se vogliamo dire che le lettere minuscole e maiuscole sono equivalenti? Quindi avremmo almeno due regole: (1) trattiamo le lettere minuscole 'a' e 'b' come equivalenti a 'A' e 'B'; (2) quindi confrontare le codifiche. Chiamiamo questo un confronto senza distinzione tra maiuscole e minuscole. È un po 'più complesso di un confronto binario.
Nella vita reale, la maggior parte dei set di caratteri ha molti caratteri: non solo 'A' e 'B' ma interi alfabeti, a volte alfabeti multipli o sistemi di scrittura orientali con migliaia di caratteri, insieme a molti simboli speciali e segni di punteggiatura. Anche nella vita reale, la maggior parte delle regole di confronto ha molte regole: non solo insensibilità al caso ma anche insensibilità all'accento (un "accento" è un segno attaccato a un personaggio come in tedesco "ö") e mappature a più caratteri (come la regola che " ö '=' OE 'in una delle due regole di confronto tedesche).
Una codifica dei caratteri è un modo per codificare i caratteri in modo che si adattino alla memoria. Cioè, se il set di caratteri è ISO-8859-15, il simbolo dell'euro, €, verrà codificato come 0xa4 e in UTF-8, sarà 0xe282ac.
La raccolta è come confrontare i caratteri, in latino9, ci sono lettere come e é è ê f
, se ordinate in base alla loro rappresentazione binaria, andrà e f é ê è
ma se la raccolta è impostata, ad esempio, sul francese, li avrai nell'ordine in cui pensavi sarebbe, che è tutto e é è ê
uguale e quindi f
.
Un set di caratteri è un sottoinsieme di tutti i glifi scritti. Una codifica dei caratteri specifica il modo in cui tali caratteri sono associati a valori numerici. Alcune codifiche di caratteri, come UTF-8 e UTF-16, possono codificare qualsiasi carattere nel set di caratteri universale. Altri, come US-ASCII o ISO-8859-1, possono codificare solo un piccolo sottoinsieme, poiché usano rispettivamente 7 e 8 bit per carattere. Poiché molti standard specificano sia un set di caratteri che una codifica dei caratteri, il termine "set di caratteri" viene spesso sostituito liberamente con "codifica dei caratteri".
Una raccolta comprende regole che specificano come i caratteri possono essere confrontati per l'ordinamento. Le regole di confronto possono essere specifiche della locale: l'ordine corretto di due caratteri varia da lingua a lingua.
La scelta di un set di caratteri e delle regole di confronto dipende dal fatto che l'applicazione sia internazionalizzata o meno. In caso contrario, a quale località ti rivolgi?
Per scegliere quale set di caratteri vuoi supportare, devi considerare la tua applicazione. Se si memorizzano input forniti dall'utente, potrebbe essere difficile prevedere tutte le impostazioni locali in cui verrà eventualmente utilizzato il software. Per supportarli tutti, potrebbe essere meglio supportare UCS (Unicode) dall'inizio. Tuttavia, c'è un costo per questo; molti caratteri dell'Europa occidentale ora richiedono due byte di spazio di archiviazione per carattere anziché uno.
La scelta delle regole di confronto corrette può aiutare le prestazioni se il database utilizza le regole di confronto per creare un indice e successivamente utilizza tale indice per fornire risultati ordinati. Tuttavia, poiché le regole di confronto sono spesso specifiche della locale, quell'indice sarà inutile se è necessario ordinare i risultati in base alle regole di un'altra locale.
Suggerisco di utilizzare utf8mb4_unicode_ci
, che si basa sullo standard Unicode per l'ordinamento e il confronto, che ordina accuratamente in una vasta gamma di lingue.
UTF-8
codifica in un sistema esterno al database, allora tutto nel database dovrebbe essere scritto correttamente se lo usi utf8mb4
in MySQL . Quando si tratta del corretto funzionamento dell'ordinamento, del confronto e della trasformazione del testo per caratteri specifici in MySQL , è difficile trovare la soluzione perfetta, ma *_unicode_ci
è sicuramente migliore di *_general
, ma ha anche i suoi svantaggi. Si prega di leggere: dev.mysql.com/doc/refman/8.0/it/charset-unicode-sets.html