phpMyAdmin
 sql >> Database >  >> Database Tools >> phpMyAdmin

Cosa accadrà ai dati esistenti se cambio le regole di confronto di una colonna in MySQL?

L'articolo http://mysqldump.azundris.com/archives/60 -Gestire-insiemi-di-caratteri.html ne discute a lungo e mostra anche cosa accadrà.

Tieni presente che stai confondendo un CHARACTER SET (in realtà una codifica) con una COLLATION.

Un set di caratteri definisce la rappresentazione fisica di una stringa in byte su disco. Puoi renderlo visibile, usando la funzione HEX(), ad esempio SELECT HEX(str) FROM t WHERE id = 1 per vedere come MySQL memorizza i byte della tua stringa. Ciò che MySQL ti offre potrebbe essere diverso, a seconda del set di caratteri della tua connessione, definito con SET NAMES .... .

Una confronto è un ordinamento. Dipende dal set di caratteri. Ad esempio, i tuoi dati potrebbero trovarsi nel set di caratteri latin1, ma potrebbero essere ordinati in base a uno dei due ordinamenti tedeschi latin1_german1_ci o latin1_german2_ci. A seconda della tua scelta, dieresi come ö verranno ordinati come oe o come o.

Quando si modifica un set di caratteri, i dati nella tabella devono essere riscritti. MySQL leggerà tutti i dati e tutti gli indici nella tabella, creerà una copia nascosta della tabella che occupa temporaneamente spazio su disco, quindi sposta la vecchia tabella in una posizione nascosta, sposta la tabella nascosta in posizione e quindi rilascia i vecchi dati, liberando aumentare lo spazio su disco. Per un po' di tempo, avrai bisogno di due volte lo spazio di archiviazione per questo.

Quando si modificano le regole di confronto, l'ordinamento dei dati cambia ma non i dati stessi. Se la colonna che stai modificando non fa parte di un indice, non devi fare altro che riscrivere il file frm e le versioni sufficientemente recenti di MySQL non dovrebbero fare di più.

Quando si modificano le regole di confronto di una colonna che fa parte di un indice, l'indice deve essere riscritto, poiché un indice è un estratto ordinato di una tabella. Ciò attiverà nuovamente la logica di copia della tabella ALTER TABLE descritta sopra.

MySQL cerca di preservare i dati in questo modo:fintanto che i dati che hai possono essere rappresentati nel set di caratteri di destinazione, la conversione non sarà con perdite. Gli avvisi verranno stampati se è in corso un troncamento dei dati e i dati che non possono essere rappresentati nel set di caratteri di destinazione verranno sostituiti da ?