Frage

Ich versuche, einige MySQL-Tabellen von latin1 auf utf8 zu konvertieren. Ich verwende den folgenden Befehl ein, die meist Arbeit scheint.

ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

Allerdings auf einer Tabelle Ich eine Fehlermeldung über einen doppelten Schlüssel Eintrag erhalten. Dies wird durch einen eindeutigen Index auf einem Feld „Namen“ verursacht. Es scheint, als zu UTF8, alle „speziellen“ Zeichen als gerade Englisch Äquivalent indiziert sind. Zum Beispiel gibt es bereits einen Datensatz mit einem Namensfeld Wert von „Dru“. Wenn auf UTF-8-Umwandlung, ein Satz mit „Dru“ ist ein Duplikat betrachtet. Das gleiche gilt für "Patrick" und "Patrick".

Hier ist, wie das Problem zu reproduzieren:

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
War es hilfreich?

Lösung

Der Grund, warum die Saiten 'Drü' und 'Dru' als gleich zu bewerten ist, dass in der utf8_general_ci Sortierung, sie gelten als "the same". Der Zweck eines Sortierungs für einen Zeichensatz ist eine Reihe von Regeln zu schaffen, wann Strings gleich ist, wenn man Sorten vor dem anderen, und so weiter.

Wenn Sie einen anderen Satz von Vergleichsregeln wollen, müssen Sie eine andere Sortierung wählen. Sie können durch die Ausgabe von utf8 die verfügbaren Sortierungen für den SHOW COLLATION LIKE 'utf8%' Zeichensatz. Es gibt eine Reihe von Sortierungen für Text gedacht, die meist in einer bestimmten Sprache ist; gibt es auch die utf8_bin Kollation der alle Zeichenfolgen als Binärstrings vergleicht (d.h. sie als Sequenzen von 0en und 1en vergleicht).

Andere Tipps

UTF8_GENERAL_CI ist Akzent unempfindlich.

Mit UTF8_BIN oder eine sprachspezifische Sortierung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top