我在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
答案 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。