Konwersja tabel mysql z latin1 na utf8

Próbuję przekonwertować niektóre tabele mysql z latin1 na utf8. Używam następującej komendy, która wydaje się w większości działać.

ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

Jednak na jednej tabeli pojawia się błąd dotyczący zduplikowanego wpisu klucza. Jest to spowodowane unikalnym indeksem w polu "Nazwa". Wygląda na to, że podczas konwersji do utf8 wszystkie "specjalne" znaki są indeksowane jako ich prosty angielski odpowiednik. Na przykład, istnieje już rekord z wartością pola name "Dru". Przy konwersji do utf8 rekord z "Drü" jest uważany za duplikat. To samo z "Patrick" i "Påtrìçk".

Oto jak odtworzyć problem:

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
Author: OMG Ponies, 2010-11-01

2 answers

Powodem, dla którego łańcuchy 'Drü' i 'Dru' oceniają jako takie same, jest to, że w zestawieniu utf8_general_ci liczą się jako "te same". Celem zestawienia dla zestawu znaków jest dostarczenie zestawu reguł dotyczących tego, kiedy ciągi znaków są takie same, kiedy JEDEN sortuje się przed drugim, i tak dalej.

Jeśli chcesz mieć inny zestaw reguł porównywania, musisz wybrać inny zestaw. Dostępne zestawienia dla zestawu znaków utf8 można zobaczyć wydając SHOW COLLATION LIKE 'utf8%'. Jest kilka istnieje również klasyfikacja utf8_bin, która porównuje wszystkie ciągi znaków jako ciągi binarne (tzn. porównuje je jako ciągi 0s i 1s).

 20
Author: Hammerite,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-01 16:13:48

UTF8_GENERAL_CI jest niewrażliwy na akcent.

Użyj UTF8_BIN lub zestawienia specyficznego dla języka.

 3
Author: Quassnoi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-01 16:10:46