質問

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

ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

ただし、1つのテーブルで、キーエントリの重複についてエラーが発生します。これは、「名前」フィールドの一意のインデックスが原因です。 UTF8に変換すると、「特別な」文字は、まっすぐな英語に相当するものとしてインデックス付けされているようです。たとえば、「DRU」の名前フィールド値を持つレコードがすでにあります。 UTF8に変換する場合、「Drü」のレコードは重複と見なされます。 「パトリック」と「ポルトトク」と同じです。

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

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
役に立ちましたか?

解決

文字列が弦をする理由 'Drü''Dru' 同じことを評価することです utf8_general_ci 照合、彼らは「同じ」とカウントされます。の目的 照合 キャラクターセットの場合、文字列が同じである場合、一方が他方より先にソートするときなど、一連のルールを提供することです。

別の比較ルールが必要な場合は、別の照合を選択する必要があります。のために利用可能な照合を見ることができます utf8 発行によるキャラクターセット SHOW COLLATION LIKE 'utf8%'. 。主に特定の言語であるテキストを対象とした照合がたくさんあります。あります utf8_bin すべての文字列をバイナリ文字列として比較する照合(つまり、それらを0Sおよび1Sのシーケンスとして比較します)。

他のヒント

UTF8_GENERAL_CI アクセントが鈍感です。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top