2015-05-04 120 views
1

这是我flask.SQLAlchemy查询:Postgres没有正确排序

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

,所以我把它打印出来:

for subs in available_subservices: 
    print subs.name 

和我所看到的是:

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

我不指望任何人知道西里尔字母顺序,但你仍然可以看到各个首都分散在各地,并且дорогадуховка都是n彼此靠近。某些类型的Python2 &可能是Unicode问题?

P.S.当我排序ServicesForOffer.name.desc()同样奇怪的顺序被转载,反过来当然。所以显然Postgres知道我没有。

回答

2

你可能没有collation正确设置它负责如何将字符串排序:

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

你可以试试这个简单地运行查询:

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

或用手动执行查询在PostgreSQL的外壳:

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

我有simmil MySQL排序问题。并将溶液:

  • 设置DEFAULT CHARACTER SET到模式为 'UTF-8'(默认为Latin-1的)和
  • 设置DEFAULT COLLATE到模式为 'utf8_unicode_ci'。

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