![](/img/trans.png)
[英]Facing issue with Case sensitive search in django-tastypie-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.