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方法中扩展此查询条件吗?
答案 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
子句中 。否则,将其构建到列定义中。