2010-11-01 12 views
16

Sto provando a convertire alcune tabelle mysql da latin1 a utf8. Sto usando il seguente comando, che sembra funzionare principalmente.Conversione di tabelle mysql da latin1 a utf8

ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; 

Tuttavia, su un tavolo viene visualizzato un errore relativo a una voce di chiave duplicata. Questo è causato da un indice univoco su un campo "nome". Sembra che quando si converte in utf8, qualsiasi carattere "speciale" venga indicizzato come equivalente inglese diretto. Ad esempio, esiste già un record con un valore del campo nome "Dru". Durante la conversione in utf8, un record con "Drü" è considerato un duplicato. Lo stesso con "Patrick" e "Påtrìçk".

Ecco come riprodurre il problema:

CREATE TABLE `example` ( `name` char(20) CHARACTER SET latin1 NOT NULL, 
    PRIMARY KEY (`name`)) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

INSERT INTO example (name) VALUES ('Drü'),('Dru'),('Patrick'),('Påtrìçk'); 

ALTER TABLE example convert to character set utf8 collate utf8_general_ci; 
ERROR 1062 (23000): Duplicate entry 'Dru' for key 1 

risposta

20

Il motivo per cui le stringhe 'Drü' e 'Dru' valutano come uguale è che nelle regole di confronto utf8_general_ci, contano come "lo stesso". Lo scopo di una fascicolazione per un set di caratteri consiste nel fornire un insieme di regole su quando le stringhe sono uguali, quando uno ordina l'altro e così via.

Se si desidera un diverso insieme di regole di confronto, è necessario scegliere una fascicolazione diversa. È possibile visualizzare le regole di confronto disponibili per il set di caratteri utf8 emettendo SHOW COLLATION LIKE 'utf8%'. Ci sono un sacco di regole di confronto intese per il testo che è principalmente in una lingua specifica; c'è anche il confronto utf8_bin che confronta tutte le stringhe come stringhe binarie (cioè le confronta come sequenze di 0 e 1).

3

UTF8_GENERAL_CI è accento insensibile.

Utilizzare UTF8_BIN o un confronto specifico della lingua.