phpMyAdmin
 sql >> Base de Dados >  >> Database Tools >> phpMyAdmin

O que acontecerá com os dados existentes se eu alterar o agrupamento de uma coluna no MySQL?


O artigo http://mysqldump.azundris.com/archives/60 -Handling-character-sets.html discute isso longamente e também mostra o que vai acontecer.

Observe que você está misturando um CHARACTER SET (na verdade, uma codificação) com um COLLATION.

Um conjunto de caracteres define a representação física de uma string em bytes no disco. Você pode tornar isso visível, usando a função HEX(), por exemplo SELECT HEX(str) FROM t WHERE id = 1 para ver como o MySQL armazena os bytes de sua string. O que o MySQL entrega a você pode ser diferente, dependendo do conjunto de caracteres de sua conexão, definido com SET NAMES .... .

Um agrupamento é uma ordem de classificação. Depende do conjunto de caracteres. Por exemplo, seus dados podem estar no conjunto de caracteres latin1, mas podem ser ordenados de acordo com uma das duas ordens de classificação alemãs latin1_german1_ci ou latin1_german2_ci. Dependendo de sua escolha, Tremas como ö serão classificados como oe ou como o.

Quando você está alterando um conjunto de caracteres, os dados em sua tabela precisam ser reescritos. O MySQL lerá todos os dados e todos os índices na tabela, fará uma cópia oculta da tabela que ocupa espaço em disco temporariamente, moverá a tabela antiga para um local oculto, moverá a tabela oculta para o lugar e, em seguida, descartará os dados antigos, liberando espaço em disco. Por algum tempo, você precisará de duas vezes o armazenamento para isso.

Quando você está alterando um agrupamento, a ordem de classificação dos dados é alterada, mas não os dados em si. Se a coluna que você está alterando não faz parte de um índice, nada precisa ser feito além de reescrever o arquivo frm, e versões suficientemente recentes do MySQL não devem fazer mais.

Quando você está alterando um agrupamento de uma coluna que faz parte de um índice, o índice precisa ser reescrito, pois um índice é um trecho classificado de uma tabela. Isso acionará novamente a lógica de cópia da tabela ALTER TABLE descrita acima.

O MySQL tenta preservar os dados fazendo isso:Desde que os dados que você possui possam ser representados no conjunto de caracteres de destino, a conversão não terá perdas. Os avisos serão impressos se houver truncamento de dados, e os dados que não puderem ser representados no conjunto de caracteres de destino serão substituídos por ?