2011-08-02 6 views
8

私はDjango Webアプリケーションを使用してMySQLデータベースにUnicode文字列を格納しています。私は、Unicodeデータの罰金を保存することができますが、クエリを実行するとき、私はéeは、それらが同じ文字であるかのように扱われていることを見つける:MySQLがéを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のシェルを使用している場合これもそうである:

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設定を経由して渡しているオプションは次のとおりです。私は効果なしで、utf8_binにテーブルの照合順序を設定しようとした

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

注:

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) 

これらの文字を別の文字として扱うにはどうすればよいですか?

+0

'SHOW CREATE TABLE tablename'の出力を掲示してください。ここで' tablename'は関連する列を含む表の名前です。 – Hammerite

+0

質問を編集してテーブルスキーマを追加しました。ありがとう。 – claymation

答えて

9
上のクエリよりも遅い、と言うよう utf8_unicode_ci内

は、以下のことを覚えているようあなたはそのフィールドの文字セットを設定する必要が望むものを得るためには

テーブルの照合順序を変更したときは、ほぼそこにいましたが、それほどではありませんでした。 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内のcharsetフィールド上のクエリはutf8_general_ciフィールド

関連する問題