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?
- I tuoi dati non cambieranno (a meno che tu non modifichi anche il set di caratteri). Va bene.
- Tutti gli indici che coinvolgono colonne con regole di confronto verranno rigenerati.
- 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)