源码文档:
排序规则设置¶
列的排序规则设置控制数据的排序顺序以及哪些字符串比较相等。您可以指定db_collation
参数来设置 和 列的排序规则 CharField
名称 TextField
。
排序规则也可以在数据库范围的级别和每个表上设置。这 在 MySQL 文档中有详细记录。在这种情况下,您必须通过直接操作数据库设置或表来设置排序规则。Django 不提供 API 来更改它们。
默认情况下,对于 UTF-8 数据库,MySQL 将使用 utf8_general_ci
排序规则。这会导致所有字符串相等比较以不区分大小写的方式进行。也就是说,"Fred"
并且 "freD"
在数据库级别被认为是相等的。如果您对字段有唯一约束,则尝试将两者插入同一列是非法"aa"
的 "AA"
,因为它们与默认排序规则比较相等(因此,非唯一)。如果要对特定列或表进行区分大小写的比较,请更改列或表以使用 utf8_bin
排序规则。
请注意,根据MySQL Unicode Character Sets,utf8_general_ci
排序规则的比较比utf8_unicode_ci
. 如果这对您的应用程序来说是可以接受的,那么您应该使用它,utf8_general_ci
因为它更快。如果这是不可接受的(例如,如果您需要德语字典顺序),请使用它,utf8_unicode_ci
因为它更准确。
警告
模型表单集以区分大小写的方式验证唯一字段。因此,当使用不区分大小写的排序规则时,具有仅大小写不同的唯一字段值的表单集将通过验证,但在调用save()
时, IntegrityError
将引发 an。
在 Django 3.2 中更改:
添加了对设置字段的数据库排序规则的支持。[无法理解]
解决方案:
如果字符集是UTF8,排序规则为 utf8_bin
如果字符集是UTF8mb4,排序规则为 utf8mb4_bin