Django mysql count distinct 给 postgres 不同的结果

Django mysql count distinct gives different result to postgres

我正在尝试计算 Django 查询中针对 mysql 数据库与 postgres 数据库中相同数据的过滤结果集的不同字符串值。但是,我得到的结果非常令人困惑。

在下面的代码中,NewOrder 表示对 postgres 数据库中相同数据的查询,而 OldOrder 是 MYSQL 实例中的相同数据。

(在旧数据库中,已完成订单的状态=1,在新数据库中完成状态='Complete'。两者中的'email'字段相同)

OldOrder.objects.filter(status=1).count()
6751

NewOrder.objects.filter(status='Complete').count()
6751

OldOrder.objects.filter(status=1).values('email').distinct().count()
3747

NewOrder.objects.filter(status='Complete').values('email').distinct().count()
3825

print NewOrder.objects.filter(status='Complete').values('email').distinct().query
SELECT DISTINCT "order_order"."email" FROM "order_order" WHERE "order_order"."status" = Complete

print OldSale.objects.filter(status=1).values('email').distinct().query
SELECT DISTINCT "order_order"."email" FROM "order_order" WHERE "order_order"."status" = 1

这就是它变得非常奇怪的地方

new_orders = NewOrder.objects.filter(status='Complete').values_list('email', flat=True)
len(set(new_orders))
3825

old_orders = OldOrder.objects.filter(status=1).values_list('email',flat=True)
len(set(old_orders))
3825

谁能解释一下这个差异?并可能指出为什么 postgres 和 mysql 之间的结果会不同?我唯一的猜测是字符编码问题,但我希望 python set() 的结果也不同?

听起来您可能在 MySQL 中使用了不区分大小写的排序规则。 PostgreSQL 中没有等价物;最接近的是 citext 数据类型,但通常你只是比较 lower(...) 字符串,或者使用 ILIKE 进行模式匹配。

我不知道在 Django 中怎么说,但我会看看不同小写电子邮件地址集的计数是否与旧数据库相同。

根据 the Django docs 这样的事情可能会起作用:

NewOrder.objects.filter(status='Complete').values(Lower('email')).distinct()