【问题标题】:django extend query condition `COLLATION`django扩展查询条件`COLLATION`
【发布时间】:2019-01-16 20:49:48
【问题描述】:

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方法中扩展吗?

【问题讨论】:

标签: mysql django collation


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2021-10-08
    • 2019-06-11
    • 2017-06-07
    • 1970-01-01
    • 2013-01-19
    • 2023-03-16
    • 2019-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多