首页 > 解决方案 > 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 方法中扩展这个查询条件吗?

标签: mysqldjangocollation

解决方案


ALTER TABLE test DEFAULT COLLATE ...仅更改“默认值”。也就是说,当您稍后添加一列时,它将获得该排序规则。

反而:

ALTER TABLE test MODIFY xyz ... COLLATE ...对于您需要更改的每一列。

或者您可以盲目地更改所有 varchar/text 列:

`ALTER TABLE 测试 CONVERT TO CHARACTER SET ... COLLATE ...;

请注意,如果您有,则不能使用索引WHERE name = 'a' COLLATE ...- 即使您有,它也必须检查所有行INDEX(name)

..._bin排序规则检查位;也就是说,它们区分大小写和重音。 ..._ci排序规则不区分大小写和重音。

只有当您需要更改排序规则时,我才会将排序规则放在WHERE子句中。否则,将其构建到列定义中。


推荐阅读