2016-12-28 65 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