Domanda

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

ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

Tuttavia, su una tabella viene visualizzato un errore relativo all'immissione di una chiave duplicata.Ciò è causato da un indice univoco su un campo "nome".Sembra che durante la conversione in utf8, tutti i caratteri "speciali" vengano indicizzati come il loro equivalente inglese diretto.Ad esempio, esiste già un record con il 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
È stato utile?

Soluzione

Il motivo per cui le stringhe 'Drü' E 'Dru' valutare come lo stesso è quello in utf8_general_ci confronto, contano come "uguali".Lo scopo di a collazione per un set di caratteri significa fornire un insieme di regole su quando le stringhe sono uguali, quando una viene ordinata prima dell'altra e così via.

Se desideri un insieme diverso di regole di confronto, devi scegliere un confronto diverso.Puoi vedere le regole di confronto disponibili per il file utf8 set di caratteri tramite emissione SHOW COLLATION LIKE 'utf8%'.Esistono numerose raccolte destinate a testi che sono principalmente in una lingua specifica;c'è anche il utf8_bin confronto che confronta tutte le stringhe come stringhe binarie (cioèli confronta come sequenze di 0 e 1).

Altri suggerimenti

UTF8_GENERAL_CI è accento insensibile.

Usa UTF8_BIN o regole di confronto della lingua specifica.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top