2011-07-09 28 views
4

私はUTF8のテーブルを持っているなどのデータを格納しています:アクセント記号付きの文字を組み合わせないMySQLのutf8の照合はありますか?

+-------+--------+ 
| name | gender | 
+-------+--------+ 
| ESMÉ | F  | 
| ESME | F  | 
+-------+--------+ 
しかし

、私は(名前、性別)に一意のキーを追加しようとすると、これら2つの行が制約に違反します。私はutf8_bin照合を使用して目標を達成することができましたが、大文字と小文字を区別しません。

私が本当に探しているのは、utf8データを保存する方法ですが、アクセント付きでアクセントのない文字は、私のユニークなキーで同等のものと見なすことはできません。

+0

照合設定によって課される等価性を完全に無視するvarbinary列を使用できます。私はIdがこれを良い考えとして推奨するとは思っていませんが、Imはそれを可能にしています。 – carpii

答えて

1

あなたが望むものは、直接可能ではないと思います。 照合は、日付をソートして比較する方法を決定します。あなたのキーには、2つの値を別個のものとして見せたいが、通常の比較では同じものと見なすことを望む。

あなたのクエリを指定するときには、これがうまくいきます。照合を指定せずに結果をutf8にキャストするだけです。これにより結果がキャストされ、照合順序がデフォルトに戻されます。

次の例は、私が何を意味するかを示しています

mysql> show create table test_col; 
+----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
| Table | Create Table                                      | 
+----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
| test_col | CREATE TABLE `test_col` (
    `name` varchar(200) COLLATE utf8_bin DEFAULT NULL, 
    UNIQUE KEY `ixuniq` (`name`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin | 
+----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
1 row in set (0.00 sec) 

mysql> insert into test_col (name) values ('Y'),(unhex('c39d'));Query OK, 2 rows affected (0.00 sec) 
Records: 2 Duplicates: 0 Warnings: 0 

mysql> select * from test_col; 
+------+ 
| name | 
+------+ 
| Y | 
| Ý | 
+------+ 
2 rows in set (0.00 sec) 

mysql> select * from test_col where name='Y'; 
+------+ 
| name | 
+------+ 
| Y | 
+------+ 
1 row in set (0.00 sec) 

mysql> select * from test_col where convert(name using 'utf8')='y';+------+ 
| name | 
+------+ 
| Y | 
| Ý | 
+------+ 
2 rows in set (0.00 sec) 
0

私は正確に同じ問題を抱えている、照合がラテン語に存在し、それがlatin1_general_ciですが、どれもUTF8には存在しません。

関連する問題