2016-12-28 47 views
2

我有簡單的模型在Django:奇怪不區分大小寫選擇行爲的Django + 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 

我期待什麼?

我從get_or_create這將創建一個名爲Ansible新標籤期待,但它返回命名爲ansible

回答

3

Mysql的開箱即用的情況下,是一些insensitive存在標籤。這種行爲與django無關。

默認字符集和整理是LATIN1和 latin1_swedish_ci,所以非二進制字符串比較是區分 默認不敏感的。這意味着如果您使用col_name LIKE'a%'進行搜索,則會獲得以A或a開頭的所有列值。要使 此搜索大小寫敏感,請確保其中一個操作數具有區分大小寫或二進制排序規則 。例如,如果您比較 列和一個字符串,它都有latin1字符集,你可以 使用COLLATE操作符,使操作具有 latin1_general_cs或latin1_bin校對特性:

您可以make it case sensitive在系統,數據庫,表格甚至列級別。

+0

謝謝!,對我很失望=( – user3479125

+0

不用擔心,很高興能得到幫助。 – e4c5