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

Effetti dell'aggiornamento di una tabella con righe da utf8_turkish_ci a utf8_general_ci?

I dati delle tue colonne vengono memorizzati utilizzando un set di caratteri. In questo caso sembra essere utf8.

Quando si opera su tali colonne (eseguendo, ad esempio, confronti di uguaglianza o ordinamento), MySQL utilizza un confronto. Ogni colonna ha regole di confronto predefinite, che eredita dalle regole di confronto predefinite della tabella.

Gli indici hanno le regole di confronto predefinite della colonna integrate in modo che possano funzionare in modo efficiente.

Puoi eseguire un confronto di uguaglianza qualificato da regole di confronto. Ad esempio, in un JOIN puoi specificare

ON (turkish.village_name COLLATE utf8_general_ci) = euro.village_name

o forse

ON turkish.village_name = (euro.village_name COLLATE utf8_turkish_ci)

Ciò dovrebbe eliminare il tuo mix illegale di regole di confronto senza che tu debba modificare il tuo tavolo. Questo può aiutarti a evitare la modifica del database di cui stai chiedendo. Ma attenzione, usando il COLLATE qualificatore può annullare l'uso di un indice. Se hai una tabella di grandi dimensioni e ti affidi agli indici per le prestazioni, questo potrebbe non essere utile.

Quindi, cosa accadrà se modifichi le tue tabelle per cambiare le regole di confronto predefinite?

  1. I tuoi dati non cambieranno (a meno che tu non modifichi anche il set di caratteri). Va bene.
  2. Tutti gli indici che coinvolgono colonne con regole di confronto verranno rigenerati.
  3. I confronti e gli ordini possono cambiare. Non conosco il turco, quindi non posso dirti cosa potrebbe rompersi. Ma, ad esempio, in spagnolo le lettere N e Ñ non sono la stessa cosa. N viene prima di Ñ in una collazione spagnola, ma nella collazione generale sono trattati allo stesso modo. Potrebbero esserci alcuni aspetti dell'alfabeto turco che funzionano allo stesso modo, quindi il tuo ORDER BY i risultati non saranno corretti.

Ma puoi risolverlo specificando un COLLATE modificatore nel tuo ORDER BY clausola.

ORDER BY (euro.village_name COLLATE utf8_turkish_ci)