繁体   English   中英

在Django中区分大小写的搜索,但在Mysql中被忽略

[英]Case sensitive search in Django, but ignored in Mysql

我在Django模型中有一个字段用于存储唯一(哈希)值。 事实证明,数据库(MySQL / inno)不会对此类型(VARCHAR)进行区分大小写的搜索,即使我明确告诉Django进行区分大小写的搜索也是如此Document.objects.get(hash__exact="abcd123") 所以都返回了“ abcd123”和“ ABcd123”,我不希望这样。

class document(models.Model):
   filename    = models.CharField(max_length=120)
   hash        = models.CharField(max_length=33 )

我可以将'hash field'更改为BinaryField,因此在数据库中它变为LONGBLOB,并且确实进行区分大小写的搜索(并且可以工作)。 但是,这对我来说似乎不是很有效。 有没有更好的方法(在Django中),例如添加'utf8 COLLATE'? 或在这种情况下正确的Fieldtype是什么? (是的,我知道我可以改用PostgreSQL。)

MySQL字符集的默认排序规则是latin1_swedish_ci,不区分大小写。 不知道为什么。 但是您应该这样创建数据库:

CREATE DATABASE database_name CHARACTER SET utf8;

正如@ dan-klasson所提到的, 默认情况下默认的非二进制字符串比较不区分大小写 注意_ci在结束latin1_swedish_ci ,它代表的情况下,insensetive。 正如Dan所提到的,您可以使用区分大小写的排序规则和字符集来创建数据库。

您可能还想知道,您始终可以创建一个表,甚至可以只设置一个列以使用不同的排序规则 (以获得相同的结果)。 您还可以在创建后更改这些归类,例如每个表:

ALTER TABLE documents__document CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

此外,如果您不想更改数据库/表的字符集/排序规则,则Django允许使用raw方法运行自定义查询 因此,尽管我自己尚未对此进行测试,但是您可以使用以下方法解决更改:

Document.objects.raw("SELECT * FROM documents__document LIKE '%s' COLLATE latin1_bin", ['abcd123'])

您区分大小写的筛选器查询错误。 应该是__exact ,像这样:

Document.objects.get(hash__exact="abcd123")

对于不区分大小写的过滤器查询,您需要使用__iexact

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM