2016-12-28 4 views
2

私はジャンゴで簡単なモデルを持っている:奇妙な大文字小文字を区別しない選択行動ジャンゴ+ mysqlの

class Tag(Model): 
    name = CharField(unique=True, max_length=50) 

は私が行うとき:

t = 'Ansible' 
print("Want tag: " + t) 
tg, created = Tag.objects.get_or_create(name=t) 
print("Got tag: " + tg.name) 
print("Query: {}".format(Tag.objects.filter(name=t).query)) 
print("Query result: {}".format(Tag.objects.filter(name=t).first().name)) 

私が得る結果:

Want tag: Ansible 
Got tag: ansible 
Query: SELECT `main_tag`.`id`, `main_tag`.`slug`, `main_tag`.`name`, `main_tag`.`added_time`, `main_tag`.`public_tips_count`, `main_tag`.`private_tips_count` FROM `main_tag` WHERE `main_tag`.`name` = Ansible 
Query result: ansible 

私はDjango==1.10.3を使用しますおよび

# mysql --version 
mysql Ver 14.14 Distrib 5.5.34, for debian-linux-gnu (armv7l) using readline 6.2 

私は何を期待していますか?

は、私はそれがAnsibleという名前の新しいタグを作成することをget_or_createから期待が、それは箱から出してansible

答えて

3

Mysqlの場合insensitiveあるという名前のいくつかの既存のタグを返します。この動作はdjangoとは関係ありません。

デフォルトの文字セットと照合

はlatin1のであり、 latin1_swedish_ciは、その非バイナリ文字列比較は、デフォルトでは大文字と小文字を区別し です。つまり、col_name LIKE 'a%'で検索すると、Aまたはaで始まるすべての列値が取得されます。 この検索で​​大文字と小文字を区別するようにするには、オペランドの1つに の大文字と小文字の区別があることを確認してください。あなたは 列との両方がLATIN1文字セットを持っている文字列を比較している場合たとえば、あなたは いずれかのオペランドが latin1_general_csまたはlatin1_bin照合を持たせるためにCOLLATE演算子を使用することができます。

あなたがmake it case sensitiveすることができますシステム、データベース、表、さらには列レベルでも使用できます。

+0

ありがとうございました!、私に恥=( – user3479125

+0

誰もがうれしく思います – e4c5

関連する問題