mysql - Django - 查询精确的字符串匹配

标签 mysql django django-orm

我的数据库中有一个具有以下值的用户:

booking_id -> 25DgW

此字段在我的模型中被标记为唯一

booking_id = models.CharField(null=False, unique=True, max_length=5, default=set_booking_id)

但是现在当我像这样查询用户时:

>>> User.objects.get(booking_id='25dgw')  # I think this should throw a DoesNotExist exacption
<User: John Doe>

即使我这样做:

>>> Partner.objects.get(booking_id__exact='25dgw')
<User: John Doe>

我需要一个查询,仅当代码的编写方式与数据库中保存的方式完全相同时才返回用户:25DgW而不是25dgw

如何查询?

最佳答案

默认情况下,MySQL 不考虑字符串的大小写。将有一个与数据库/表或列关联的字符集和排序规则。

字符集latin1的默认排序规则为latin1_swedish_ci,不区分大小写。您必须将排序规则类型更改为支持区分大小写比较的latin1_general_cs

您可以在数据库/表/列级别更改字符集/排序规则设置。

以下步骤对我有用。

  1. 进入 MySQL shell

    mysql -u user -p 数据库名

  2. 更改表/列的字符集和排序规则类型

    ALTER TABLE tablename CONVERT TO CHARACTER SET latin1 COLLATE latin1_general_cs;
    
  3. 现在尝试查询

    Partner.objects.get(booking_id__exact='25dgw')
    

这会引发错误,表匹配查询不存在。

引用 - Character Sets and Collations in MySQL

关于mysql - Django - 查询精确的字符串匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34047992/

相关文章:

python - 从前端使用 django 身份验证登录

Django 按顺序列出模型字段

python - Django REST Framework TokenAuthentication 通常在 Django 中进行身份验证

django - Django queryset values_list是否返回列表对象?

django - 通过表嵌套预取

MySQL查找最接近点的多边形

javascript - Laravel - Jquery,Ajax - 将可空数据作为数组插入数据库中

mysql - 从 SQL 查询中获取一列中的多个值

django - 在 Django 中使用 related_name 的查询性能更高吗?

给定排序顺序和 id 作为参数传递的 mysql 查询优化