Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Efeitos da atualização de uma tabela com linhas de utf8_turkish_ci para utf8_general_ci?


Os dados de suas colunas são armazenados usando um conjunto de caracteres. Neste caso, parece ser utf8.

Quando você opera nessas colunas (fazendo, por exemplo, comparações de igualdade ou ordenação), o MySQL emprega um agrupamento. Cada coluna tem um agrupamento padrão, que herda do agrupamento padrão da tabela.

Os índices têm o agrupamento padrão da coluna integrado a eles para que possam funcionar com eficiência.

Você pode fazer uma comparação de igualdade qualificada por agrupamento. Por exemplo, em um JOIN você pode especificar
ON (turkish.village_name COLLATE utf8_general_ci) = euro.village_name

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

Isso deve eliminar sua mistura ilegal de agrupamentos sem exigir que você altere sua tabela. Isso pode ajudá-lo a evitar a alteração do banco de dados sobre a qual você está perguntando. Mas cuidado, usando o COLLATE qualificador pode derrotar o uso de um índice. Se você tiver uma tabela grande e estiver contando com índices para desempenho, isso pode não ser útil.

Então, o que acontecerá se você alterar suas tabelas para alterar o agrupamento padrão?
  1. Seus dados não serão alterados (a menos que você também altere o conjunto de caracteres). Isso é bom.
  2. Quaisquer índices envolvendo colunas com agrupamentos serão gerados novamente.
  3. Suas comparações e pedidos podem mudar. Eu não sei turco, então não posso dizer o que pode quebrar. Mas, por exemplo, em espanhol as letras N e Ñ não são os mesmos. N vem antes de Ñ em um agrupamento espanhol, mas no agrupamento geral eles são tratados da mesma forma. Pode haver algum aspecto do alfabeto turco que funcione da mesma forma, então seu ORDER BY os resultados serão incorretos.

Mas você pode corrigir isso especificando um COLLATE modificador em seu ORDER BY cláusula.
ORDER BY (euro.village_name COLLATE utf8_turkish_ci)