Pergunta

Estou tentando converter algumas tabelas MySQL de Latin1 para UTF8. Estou usando o seguinte comando, que parece funcionar principalmente.

ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

No entanto, em uma tabela, recebo um erro sobre uma entrada de chave duplicada. Isso é causado por um índice exclusivo em um campo "nome". Parece que, ao converter para o UTF8, qualquer caractere "especial" é indexado como seu equivalente em inglês direto. Por exemplo, já existe um registro com um valor de campo de "DRU". Ao converter para o UTF8, um registro com "drü" é considerado uma duplicata. O mesmo com "Patrick" e "Påtrìçk".

Aqui está como reproduzir o 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
Foi útil?

Solução

A razão pela qual as cordas 'Drü' e 'Dru' avaliar como o mesmo é que no utf8_general_ci Agrupamento, eles contam como "o mesmo". O objetivo de um agrupamento Para um conjunto de personagens, é fornecer um conjunto de regras sobre quando as strings são iguais, quando uma classifica antes do outro e assim por diante.

Se você deseja um conjunto diferente de regras de comparação, precisa escolher um agrupamento diferente. Você pode ver os colações disponíveis para o utf8 personagem definido ao emitir SHOW COLLATION LIKE 'utf8%'. Há um monte de colações destinadas a texto que está principalmente em um idioma específico; Há também o utf8_bin O agrupamento que compara todas as cordas como cordas binárias (ou seja, as compara como sequências de 0s e 1s).

Outras dicas

UTF8_GENERAL_CI é sotaque insensível.

Usar UTF8_BIN ou um agrupamento específico do idioma.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top