2011-07-09 31 views
4

我有一個UTF8表和我一樣存儲數據:是否有不會混淆重音字符的MySQL utf8歸類?

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

然而,當我嘗試添加上(姓名,性別)的唯一密鑰這兩行違反約束。我已經能夠使用utf8_bin整理來實現我的目標,但後來我失去了不區分大小寫的情況。

所以我想我真正想要的是一種存儲utf8數據的方式,但沒有重音和不重複的字符被視爲等同於我的唯一鍵。

+0

您可以使用varbinary列,該列完全忽略歸類設置強加的任何相等性。我不認爲Id建議這是一個好主意,但我只是說它是可能的。 – carpii

回答

1

我不認爲你想要的是直接可能的。 排序規則確定排序和比較日期的方式。對於你的鑰匙,你希望兩個值被看作是不同的,但在你的正常比較中,你希望他們被看作是相同的。

雖然在指定查詢時有一個技巧:只需將結果轉換爲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)