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/

10-11 01:46