gpt4 book ai didi

django - 在带有 Postgresql 9.6 的 Django 中如何排序不区分大小写和重音?

转载 作者:行者123 更新时间:2023-11-29 11:44:40 26 4
gpt4 key购买 nike

我想要的是相当于在 MySQL 中使用 utf8_unicode_ci。因此,如果我有这些字符串(Postgresql 的默认排序顺序):

  • 谷仓
  • 气泡
  • 博夫
  • 牛肉
  • 轮盘赌
  • 贝莫尔

我希望它们能像这样排序(就像 MySQL 中的 utf8_unicode_ci):

  • 谷仓
  • 牛肉
  • 贝莫尔
  • 博夫
  • 轮盘赌
  • 气泡

这种排序不区分大小写,不区分重音,连字被转换为多个字符。

我知道 Postgresql 中的 unaccentlower 但我不知道如何在 Django 中使用它们。

Django/Postgresql 的可能解决方案:

  • 添加新列仅用于使用规范化数据(较低,无重音)排序。
  • 添加一个索引 ( like in this answer ),但我不确定它如何与 Django 一起工作?

我认为全文搜索或 Trigram 在这方面对我没有帮助,因为我不一定要根据文本进行搜索,但我需要获得良好的排序顺序。

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

最佳答案

它与 Django 本身无关,PostgreSQL 的 lc_collat​​e 配置决定了这一点。我建议您查看它的值(value):

SHOW lc_collate;

正确的做法是修复此配置。不要忘记查看相关设置(lc_ctype 等)。

但是如果您不能使用正确的设置创建另一个数据库,请尝试在 ORDER 上显式collat​​e,如下面的测试用例:

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 上执行。更多信息 herehere .

关于django - 在带有 Postgresql 9.6 的 Django 中如何排序不区分大小写和重音?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43986882/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com