Django mysql查询时大小写不敏感问题

源码文档:

排序规则设置¶

列的排序规则设置控制数据的排序顺序以及哪些字符串比较相等。您可以指定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

你可能感兴趣的:(Django mysql查询时大小写不敏感问题)