postgres没有正确排序

时间:2015-05-04 09:57:21

标签: python postgresql sqlalchemy

这是我的flask.SQLAlchemy查询:

available_subservices = (
    ServicesForOffer.query
    .filter_by(type=u'Дополнительная')
    .order_by(ServicesForOffer.name)
    .all()
)

所以我把它打印出来:

for subs in available_subservices:
    print subs.name

我所看到的是:

Доп.створка
Окно с двойными рамами (2 створки)
Окно с двойными рамами (3 створки)
окно с балконной дверью
Эркер
Мойка окон
Мойка окон, уборка кухни, уборка ванной и сан.узла
мытье холодильника
балкон
глажка
дорога
Разбор шкафа/антресоли/гардеробной
Мелкая бытовая техника
Жалюзи вертикальные
духовка

我不希望任何人知道西里尔字母顺序,但你仍然可以看到大写字母遍布各地,而дорогадуховка彼此并不相同。某种Python2& Unicode问题可能吗?

P.S。当我按ServicesForOffer.name.desc()排序时,同样的怪异顺序被复制,当然也是如此。所以Postgres明显知道我没有。

2 个答案:

答案 0 :(得分:2)

您可能没有正确设置collation,这对字符串的排序方式负责:

  

排序规则功能允许指定每列数据的排序顺序和字符分类行为,甚至是每次操作。这减轻了数据库的LC_COLLATE和LC_CTYPE设置在创建后无法更改的限制。

您可以通过简单地运行查询来尝试:

schema=> SELECT 'дорога' > 'духовка' COLLATE "en_US";
 ?column?
----------
 f
(1 row)

使用以下命令在PostgreSQL shell中手动执行查询:

SELECT ...
FROM ...
WHERE ...
ORDER BY name COLLATE "your collation"

如果这对你有用,你可以altering columns collation

ALTER [ COLUMN ] column [ SET DATA ] TYPE data_type [ COLLATE collation ]
      [ USING expression ]

答案 1 :(得分:1)

我有MySQL排序的类似问题。解决方案是:

  • DEFAULT CHARACTER SET设置为架构为'utf-8'(默认为latin-1)和
  • DEFAULT COLLATE设置为架构为'utf8_unicode_ci'。

另一种方法是在数据库中创建正确的架构。