2011-06-24 38 views
1

mysqlのデータはlatin1形式で大量にありますが、すべてをutf8に変換しようとしていますが、これまでのところ正しい照合順序が見つかりませんでしたそれは正しく。 データの一部は、アクセントの多い国際名と、さまざまな言語の文字と、これらのフィールドの主キーです。 私はこのように書き、簡単なテストケースがあります。latin1から来るデータにmysql utf8照合を使用する

CREATE TABLE utf8_test (value varchar(30), PRIMARY KEY(value)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_swedish_ci; 
INSERT INTO utf8_test VALUES ('e'); 
INSERT INTO utf8_test VALUES ('é'); 
INSERT INTO utf8_test VALUES ('è'); 
INSERT INTO utf8_test VALUES ('ü'); 
INSERT INTO utf8_test VALUES ('u'); 
INSERT INTO utf8_test VALUES ('y'); 
INSERT INTO utf8_test VALUES ('ÿ'); 

それは、問題を実証するための簡単なテストですが、実際のデータは、これに限定されるものではないが。

これまでのところ、utf8_binは重大なエラーなしにすべてを受け入れることができますが、大文字と小文字が区別されるため、使用できません。 何か不足していますか?

注:テーブルの中には何十億もの行があるため、パフォーマンスが要因です。

+0

'utf8_bin' *は大文字と小文字を区別します - 大文字と小文字は区別されますか?つまり、「A」と「a」を区別するために照合が必要ですか? – Mike

+0

私の悪い、私は大文字と小文字を区別し、修正したことを意味しました。 (私は検索をするとA = aを返します) – anto1ne

答えて

1

正しい照合順序は、ソースキャラクタセット(Latin-1)以上に依存します。これは、データが出てきた言語とロケールによって異なります。文字が1つも折りたたまれていないことを確認することが心配ならば、utf8_binがおそらく行く方法です。

しかし、予期しないソートが発生することがあります。文字は、特定の言語や地域の好みに応じてではなく、UTF-8バイト値に従ってソートされます。

UTF-8: General? Bin? Unicode?

で説明したように、大文字と小文字を区別しない照合を得るために、あなたは、 utf8_general_ciまたはutf8_unicode_ci内を試してみたいことがあります編集 さらなる研究は、あなたが使用することができます何の照合は現在ありませんことを示唆しています。 http://bugs.mysql.com/bug.php?id=19567を参照してください。

これはどのようにオプションですか? utf8_binをあなたの列に割り当てますが、照会で異なる照合(大文字と小文字を区別する)を適用しますか?データを失うことはなく、クエリでは大文字と小文字が区別されません。アクセントを区別しないクエリを持つことは、あなたを傷つけていない場合、それは妥協することができ...

+0

私は両方を試しましたが、e =éとy =ÿと考えて重複したキーを発生させます。 – anto1ne

+0

ああ。それは残念だ。残念なことに、私は自分自身のMySQLユーザーではないので、他に何か提案する必要はありません。 –

1

私の知る限りでは、MySQLはまだ大文字と小文字を区別のutf8照合順序を持っていないので、utf8_binは、あなたの唯一の選択肢についてです。 utf8_binは大文字と小文字を区別し、すべての分音記号を別々のものとして扱います。ブレア・コンラッドが指摘したように、それはソートの混乱を少し作ることができます。 using collate in your SQL statementsで解決できるかもしれませんが、多くのSQL文がある場合は、この方法が問題になる可能性があります。

CREATE TABLE `utf8_test` (
    `value` varchar(30) COLLATE utf8_bin NOT NULL DEFAULT '', 
    PRIMARY KEY (`value`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; 

INSERT INTO utf8_test VALUES ('e'); 
INSERT INTO utf8_test VALUES ('é'); 
INSERT INTO utf8_test VALUES ('è'); 
INSERT INTO utf8_test VALUES ('ü'); 
INSERT INTO utf8_test VALUES ('u'); 
INSERT INTO utf8_test VALUES ('y'); 
INSERT INTO utf8_test VALUES ('ÿ'); 

INSERT INTO utf8_test VALUES ('E'); 
INSERT INTO utf8_test VALUES ('É'); 
INSERT INTO utf8_test VALUES ('È'); 
INSERT INTO utf8_test VALUES ('Ü'); 
INSERT INTO utf8_test VALUES ('U'); 
INSERT INTO utf8_test VALUES ('Y'); 
INSERT INTO utf8_test VALUES ('Ÿ'); 

SELECT value FROM utf8_test WHERE value = 'E'; 
+-------+ 
| value | 
+-------+ 
| E  | 
+-------+ 

SELECT value FROM utf8_test WHERE value COLLATE utf8_unicode_ci = 'E'; 

+-------+ 
| value | 
+-------+ 
| E  | 
| e  | 
| È  | 
| É  | 
| è  | 
| é  | 
+-------+ 

SELECT value FROM utf8_test ORDER BY value; 

+-------+ 
| value | 
+-------+ 
| E  | 
| U  | 
| Y  | 
| e  | 
| u  | 
| y  | 
| È  | 
| É  | 
| Ü  | 
| è  | 
| é  | 
| ü  | 
| ÿ  | 
| Ÿ  | 
+-------+ 

SELECT value FROM utf8_test ORDER BY value COLLATE utf8_unicode_ci; 

+-------+ 
| value | 
+-------+ 
| E  | 
| é  | 
| è  | 
| É  | 
| È  | 
| e  | 
| u  | 
| Ü  | 
| U  | 
| ü  | 
| y  | 
| Y  | 
| ÿ  | 
| Ÿ  | 
+-------+ 
関連する問題