django == 1.11.9
mysql版本5.6.38
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database | utf8_general_ci |
| collation_server | utf8_general_ci |
+----------------------+-----------------+
我的数据中有一个重音字段,并且设置了唯一字段。但是,多个结果将出现在查询中。虽然我知道您可以通过
ALTER TABLE test DEFAULT COLLATE utf8_bin;
设置表属性。但是我认为更好的方法是通过查询添加条件SELECT * FROM test WHERE name = 'a' collate utf8_bin;
。现在,我不知道如何在queryset方法中使用它。我在插入数据时通常使用
update_or_create()
方法,这将直接导致某些其他形式(带有重音符号)的数据没有插入其中。可以在Django的queryset方法中扩展此查询条件吗?
最佳答案
ALTER TABLE test DEFAULT COLLATE ...
仅更改“默认”。也就是说,当您以后添加一列时,它将获得该排序规则。
代替:ALTER TABLE test MODIFY xyz ... COLLATE ...
您需要更改的每一列。
或者,您可以盲目更改所有varchar / text列:
`ALTER TABLE test转换为字符集... COLLATE ...;
请注意,使用WHERE name = 'a' COLLATE ...
时不能使用索引-即使使用INDEX(name)
,也必须检查所有行。..._bin
归类检查位;也就是说,它们对大小写和重音敏感。 ..._ci
归类不区分大小写和重音。
仅在需要更改排序规则时,我才将排序规则放在WHERE
子句中。否则,将其构建到列定义中。
关于mysql - django扩展查询条件“COLLATION”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51766153/