django扩展查询条件`COLLATION`

时间:2018-08-09 11:45:17

标签: mysql django collation

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方法中扩展此查询条件吗?

1 个答案:

答案 0 :(得分:0)

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子句中 。否则,将其构建到列定义中。