我的问题是,对于我的一个模型,来自相应管理页面的搜索栏正在执行区分大小写的搜索,而默认情况下它应该是不区分大小写的搜索。
从这里我可以找到,我觉得这可能与数据库编码有关,但是从文档中,它说django假设所有内容都是utf-8编码的,我检查了mysql表,字段都是utf-8编码的。
可能是因为我的一个领域出现了希腊字符吗?我如何在至少不包含希腊字母的字段中强制进行不区分大小写的搜索?目前,搜索对所有字段都区分大小写。但它对其他模型工作正常(不区分大小写)。
型号:
class MyModel(models.Model):
id = models.AutoField(primary_key=True)
field1 = models.CharField(max_length=200) # Might contain greek letters
field2 = models.CharField(max_length=200, unique=True)
不共享管理类代码,因为这里没有什么花哨的东西。只是标准的 list_display
, search_fields
, ordering
以及 fieldsets
.
使用django 1.10
编辑
下面是 SHOW CREATE TABLE
有关表格:
CREATE TABLE `my_model` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`field1` varchar(200) COLLATE utf8_bin NOT NULL,
`field2` varchar(200) COLLATE utf8_bin NOT NULL,
# Non relevant other fields
PRIMARY KEY (`id`),
UNIQUE KEY `my_model_field2_63f9df5e_uniq` (`field2`)
) ENGINE=InnoDB AUTO_INCREMENT=657 DEFAULT CHARSET=utf8 COLLATE=utf8_bin
现在我明白了,可能是因为 _bin
正确的?我是不是该换些 _ci
? 在django是怎么做的?
2条答案
按热度按时间kuhbmx9i1#
现在用field1\u lower而不是field1搜索。希望有帮助。
mcdcgff02#
utf8_bin
区分大小写。更改为utf8_unicode_520_ci
(如果使用MySQL5.6或5.7):使用
LOWER()
这可能会起作用,但速度很慢,因为它会阻止使用索引,因此可能会使查询的运行速度慢得多。注:考虑到表情符号和所有中文,
utf8mb4
需要代替utf8
.您的模型为单个表指定了3个唯一键?这似乎太过分了。那我就被
CREATE TABLE
--它只显示2个(注:PRIMARY KEY
是UNIQUE
.)根据django docs的说法,“在所有情况下,您都可以通过直接操作数据库表来设置排序规则;django没有提供一种在模型定义中设置这个的方法
SHOW CREATE TABLE
通过mysql实用程序可以告诉您当前正在使用什么排序规则。