16

いくつかのmysqlテーブルをlatin1からutf8に変換しようとしています。私は次のコマンドを使用していますが、これはほとんど機能しているようです。

ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

ただし、1つのテーブルで、キーエントリの重複に関するエラーが発生します。これは、「名前」フィールドの一意のインデックスが原因で発生します。utf8に変換すると、「特殊」文字はすべて、英語に相当するものとしてインデックス付けされるようです。たとえば、名前フィールドの値が「Dru」のレコードがすでに存在します。utf8に変換する場合、「Drü」を含むレコードは重複と見なされます。「Patrick」と「Påtrìçk」も同じです。

問題を再現する方法は次のとおりです。

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
4

2 に答える 2

20

文字列'Drü''Dru'評価が同じである理由は、utf8_general_ci照合では「同じ」と見なされるためです。文字セットの照合の目的は、文字列が同じである場合、一方が他方の前にソートされる場合などに関する一連のルールを提供することです。

別の比較ルールのセットが必要な場合は、別の照合を選択する必要があります。utf8を発行すると、文字セットで使用可能な照合を確認できますSHOW COLLATION LIKE 'utf8%'。主に特定の言語で書かれたテキストを対象とした照合がたくさんあります。utf8_binすべての文字列をバイナリ文字列として比較する(つまり、0と1のシーケンスとして比較する)照合もあります。

于 2010-11-01T16:13:48.727 に答える
3

UTF8_GENERAL_CIアクセントに影響されません。

UTF8_BINまたは言語固有の照合を使用します。

于 2010-11-01T16:10:46.530 に答える