Cosa significano esattamente set di caratteri e regole di confronto?
-
19-08-2019 - |
Domanda
Riesco a leggere la documentazione 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.
Soluzione
Da MySQL docs :
Un set di caratteri è un insieme di simboli e codifiche. Un confronto è un insieme di regole per confrontare i caratteri in a set di caratteri. Facciamo il distinzione chiara con un esempio di un set di caratteri immaginari.
Supponiamo di avere un alfabeto con quattro lettere: 'A', 'B', 'a', 'b'. Noi assegna a ogni lettera un numero: 'A' = 0, 'B' = 1, 'a' = 2, 'b' = 3. La lettera 'A' è un simbolo, il numero 0 è il codifica per "A" e la combinazione di tutte e quattro le lettere e la loro la codifica è un set di caratteri.
Ora supponiamo di voler confrontare due valori di stringa, 'A' e 'B'. Il il modo più semplice per farlo è guardare le codifiche: 0 per 'A' e 1 per 'B'. Perché 0 è inferiore a 1, diciamo 'A' è inferiore a 'B'. Ora, quello che abbiamo appena fatto è applicare un confronto al nostro set di caratteri. La raccolta è un set di regole (solo una regola in questo caso): " confronta le codifiche. " Questo lo chiamiamo la più semplice di tutte le regole di confronto a fascicolazione binaria.
Ma cosa succede se vogliamo dire che il sono lettere minuscole e maiuscole equivalente? Quindi avremmo almeno due regole: (1) trattare il lettere minuscole 'a' e 'b' come equivalente a "A" e "B"; (2) quindi confrontare le codifiche. Lo chiamiamo a confronto senza distinzione tra maiuscole e minuscole. È un poco più complesso di un binario collazione.
Nella vita reale, la maggior parte dei set di personaggi ha molti personaggi: non solo "A" e "B" ma interi alfabeti, a volte alfabeti multipli o scrittura orientale sistemi 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: no solo insensibilità al case ma anche insensibilità all'accento (un "accento" è a segno attaccato a un personaggio come in Tedesco "& # 246;") e carattere multiplo mappature (come la regola che '& # 246;' = "OE" in uno dei due tedeschi Le regole di confronto).
Altri suggerimenti
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, & # 8364 ;, verrà codificato come 0xa4 e in UTF-8, sarà 0xe282ac.
La collation è come confrontare i caratteri, in latino9, ci sono lettere come e f & # 233; & # 234; & # 232;
ma se le regole di confronto sono impostate, ad esempio, sul francese, le avrai nell'ordine in cui pensavi che fossero, che è tutto e & # 233; & # 232; & # 234;
sono uguali, 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 per la "codifica dei caratteri".
Le regole di confronto comprendono regole che specificano come confrontare i caratteri 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 lingua ti rivolgi?
Per scegliere il set di caratteri che 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 memoria 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 secondo le regole di un'altra locale.
Suggerisco di usare utf8mb4_unicode_ci
, che si basa sullo standard Unicode per l'ordinamento e il confronto, che ordina in modo accurato in una vasta gamma di lingue.