奇怪的不区分大小写的选择行为Django + mysql

时间:2016-12-28 12:26:41

标签: mysql django

我在Django中有简单的模型:

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

的标记

1 个答案:

答案 0 :(得分: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