在Django和Postgresql 9.6中,如何区分大小写和重音?

在Django和Postgresql 9.6中,如何区分大小写和重音?,django,postgresql,sorting,Django,Postgresql,Sorting,我想要的是在MySQL中使用utf8\uUnicode\uCI。因此,如果我有这些字符串(Postgresql的默认排序顺序): 谷仓 泡泡 布卢夫 牛肉 布莱特 贝摩尔 我希望它们能像这样排序(就像MySQL中的utf8\u unicode\u ci): 谷仓 牛肉 贝摩尔 布卢夫 布莱特 泡泡 这种排序不区分大小写,不区分重音,连字转换为多个字符 我知道Postgresql中的uncent和lower,但我不知道如何从Django使用它们 Django/Postgresql可能的解决

我想要的是在MySQL中使用
utf8\uUnicode\uCI
。因此,如果我有这些字符串(Postgresql的默认排序顺序):

  • 谷仓
  • 泡泡
  • 布卢夫
  • 牛肉
  • 布莱特
  • 贝摩尔
我希望它们能像这样排序(就像MySQL中的
utf8\u unicode\u ci
):

  • 谷仓
  • 牛肉
  • 贝摩尔
  • 布卢夫
  • 布莱特
  • 泡泡
这种排序不区分大小写,不区分重音,连字转换为多个字符

我知道Postgresql中的
uncent
lower
,但我不知道如何从Django使用它们

Django/Postgresql可能的解决方案:

  • 添加新列仅用于对数据进行规范化排序(较低,不相关)
  • 添加一个索引(),但我不确定它将如何与Django一起工作
我不认为全文搜索或三角图可以帮助我,因为我不一定要做基于文本的搜索,但我需要得到良好的排序顺序


理想情况下,查询应该是快速的,因此使用另一个索引列看起来是一个很好的途径。但我希望找到一个解决方案,我不需要为我数据库中的每个现有文本列实现,并且易于维护,等等。有没有最佳实践可以做到这一点

它与Django本身无关,PostgreSQL的
lc\u collate
配置决定了这一点。我建议您回顾一下它的价值:

SHOW lc_collate;
正确的做法是修复此配置。不要忘记查看相关设置(
lc\ctype
等)

但是,如果无法使用正确的设置创建另一个数据库,请尝试在
顺序上显式地
整理
,如以下测试用例所示:

CREATE TEMPORARY TABLE table1 (column1 TEXT); 

INSERT INTO table1 VALUES('Barn'),
('beef'),
('bémol'),
('Bœuf'),
('boulette'),
('Bubble');

SELECT * FROM table1 ORDER BY column1 COLLATE "en_US"; --Gives the expected order
SELECT * FROM table1 ORDER BY column1 COLLATE "C"; --Gives "wrong" order  (in your case)
重要的是要记住,PostgreSQL依赖于操作系统区域设置。此测试用例在CentOS 7上执行。更多信息和信息。

我是这样做的:

但您需要先在postgresql中启用模块“uncent”,然后才能执行以下操作:
createextensionuncent

def get_value_ci(field):
    return Func(field, function='LOWER', template='UNACCENT(%(function)s(%(expressions)s))')

YoutModel.objects.order_by(get_value_ci('nome_your_field'))

和工作,;)

据我所知,Postgresql没有任何排序规则可以实现我想要的排序。如果你能证明我错了,我会很高兴的@Etienne我在答案中添加了一个测试用例。我尝试了你的测试用例,两个
SELECT
都给出了相同的排序顺序。但我使用的是一个旧的OS X系统,正在阅读您的消息。请记住,几年前我可能在这个系统上遇到了这个问题!我将在另一个系统上测试它,然后返回。谢谢你说得对,我的问题是旧OS X系统上的系统区域设置不好。是时候升级这个系统了!再次感谢。很高兴能帮助你@Etienne