2011-08-02 56 views
8

我使用Django Web應用程序將Unicode字符串存儲在MySQL數據庫中。我可以存儲Unicode數據很好,但是查詢的時候,我發現ée被視爲好像它們是相同的字符:爲什麼MySQL將e視爲e?

In [1]: User.objects.filter(last_name='Jildén') 
Out[1]: [<User: Anders Jildén>] 

In [2]: User.objects.filter(last_name='Jilden') 
Out[2]: [<User: Anders Jildén>] 

這也是如此使用MySQL直接shell時:

mysql> select last_name from auth_user where last_name = 'Jildén'; 
+-----------+ 
| last_name | 
+-----------+ 
| Jildén | 
+-----------+ 
1 row in set (0.00 sec) 

mysql> select last_name from auth_user where last_name = 'Jilden'; 
+-----------+ 
| last_name | 
+-----------+ 
| Jildén | 
+-----------+ 
1 row in set (0.01 sec) 

這裏是數據庫字符集設置:

mysql> SHOW variables LIKE '%character_set%'; 
+--------------------------+------------------------------------------------------+ 
| Variable_name   | Value            | 
+--------------------------+------------------------------------------------------+ 
| character_set_client  | latin1            | 
| character_set_connection | latin1            | 
| character_set_database | utf8             | 
| character_set_filesystem | binary            | 
| character_set_results | latin1            | 
| character_set_server  | latin1            | 
| character_set_system  | utf8             | 
| character_sets_dir  | /usr/local/Cellar/mysql/5.1.54/share/mysql/charsets/ | 
+--------------------------+------------------------------------------------------+ 

這裏的表模式:

CREATE TABLE `auth_user` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `username` varchar(30) CHARACTER SET utf8 NOT NULL, 
    `first_name` varchar(30) CHARACTER SET utf8 NOT NULL, 
    `last_name` varchar(30) CHARACTER SET utf8 NOT NULL, 
    `email` varchar(200) CHARACTER SET utf8 NOT NULL, 
    `password` varchar(128) CHARACTER SET utf8 NOT NULL, 
    `is_staff` tinyint(1) NOT NULL, 
    `is_active` tinyint(1) NOT NULL, 
    `is_superuser` tinyint(1) NOT NULL, 
    `last_login` datetime NOT NULL, 
    `date_joined` datetime NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `username` (`username`) 
) ENGINE=InnoDB AUTO_INCREMENT=7952 DEFAULT CHARSET=utf8 COLLATE=utf8_bin 

,這裏是我通過Django的DATABASES設置傳遞選項:

DATABASES = { 
    'default': { 
     # ... 
     'OPTIONS': { 
      'charset': 'utf8', 
      'init_command': 'SET storage_engine=INNODB;', 
     }, 
    }, 
} 

請注意,我已經嘗試了表整理設置到utf8_bin,沒有效果:

mysql> alter table auth_user collate utf8_bin; 

mysql> select last_name from auth_user where last_name = 'Jilden'; 
+-----------+ 
| last_name | 
+-----------+ 
| Jildén | 
+-----------+ 
1 row in set (0.00 sec) 

我如何讓MySQL將這些視爲不同的角色?

+0

請寄出'SHOW CREATE TABLE tablename'的輸出,其中'tablename'是包含相關列的表的名字。 – Hammerite

+0

我編輯了問題以包含表格模式。謝謝。 – claymation

回答

9

當您更改表格排序規則時,您幾乎在那裏,但不完全。在MySQL中,表中的每一列都有自己的字符集和歸類。該表具有自己的字符集和歸類,但不會覆蓋列歸類;它僅確定將添加的新列的排序規則,您不指定排序規則。所以你沒有改變你感興趣的列的排序規則。

ALTER TABLE tablename MODIFY columnname 
    varchar(???) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL 
8

您需要設置將變音符號視爲重要的歸類。嘗試使用utf8_bin

+0

我試着將表格整理設置爲''utf8_bin'',但這似乎沒有幫助。除了以外,還有其他一些我需要做的:''ALTER TABLE auth_user COLLATE utf8_bin''? – claymation

+2

@claymation:'ALTER TABLE ... COLLATE'實際上是'ALTER TABLE ... DEFAULT COLLATE',它只會影響新添加的列。你需要運行'ALTER TABLE auth_user CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin'。 – Quassnoi

1

我認爲知道表格的字符集和您正在查詢的字段是很重要的。

回答你的問題可以在這裏找到
http://dev.mysql.com/doc/refman/5.0/en/charset-unicode-sets.html

也許你正在查詢的字段有utf8_general_ci字符集。
爲了得到你想要的東西,你應該設置該字段的字符集爲utf8_unicode_ci

記住,因爲手冊上說,查詢上utf8_unicode_ci字符集的字段在utf8_general_ci比查詢慢領域

相關問題