【问题标题】:Heroku Postgres ignores underscores when sortingHeroku Postgres 在排序时忽略下划线
【发布时间】:2019-09-18 05:11:38
【问题描述】:

这让我发疯了。我的 Heroku Postgres (9.5.18) DB 在排序结果时似乎忽略了下划线:

查询:

SELECT category FROM categories ORDER BY category ASC;

结果:

category
-------------------
z_commercial_overlay
z_district
zr_use_group
zr_uses_footnote
z_special_district

这对我来说是新的。我从来没有注意到另一个系统在排序时不尊重下划线,这是我第一次注意到 Postgres 有这样的行为。

在我的本地 OSX 机器(Postgres 10.5)上,结果按“正常”预期方式排序:

category
-------------------
z_commercial_overlay
z_district
z_special_district
zr_use_group
zr_uses_footnote

更新:

基于 cmets,我能够通过使用 COLLATE "C" 得到正确的排序

SELECT category FROM categories ORDER BY category COLLATE "C" ASC;

但我不明白为什么这是必要的。两个 Postgres 实例都显示相同的默认排序规则值,并且所有表列都以相同的方式创建,没有指定备用排序规则。

SHOW lc_collate;

 lc_collate  
-------------
 en_US.UTF-8

SHOW lc_ctype;

  lc_ctype   
-------------
 en_US.UTF-8

那么为什么 Heroku Postgres DB 需要 COLLATE 声明?

【问题讨论】:

标签: postgresql heroku-postgres


【解决方案1】:

我从来没有遇到过在排序时不考虑下划线的其他系统

真的吗?从来没用过,还是从来没注意过?

在 Ubuntu 16.04(以及我关注的所有其他现代系统)上,只要您使用 en_US,系统排序工具的行为方式就相同。

LC_ALL= LANG=en_US.UTF-8 sort
<produced the same order as the first one you show above)

在我的本地盒子(Postgres 10.5)上,结果按“正常”预期方式排序: 两个 Postgres 实例都显示相同的排序规则值:

SHOW lc_collate;
lc_collate  

 en_US.UTF-8

这仅显示数据库的默认排序规则。该列可能已被声明为使用与默认值不同的排序规则:

create table categories(category text collate "C");

如果您的本地数据库应该使用 en_US,但没有使用,那么它就被破坏了。

【讨论】:

  • “在 Ubuntu 16.04(以及我关注的所有其他现代系统)上,系统排序工具的行为方式相同”——这对我来说很奇怪,因为这不是最常见的编程语言的方式做它(Ruby,JS)也不是我的 OSX Postgres 实例。 “这仅显示数据库的默认排序规则。该列可能已声明使用与默认排序规则不同的排序规则” - 这不是发生的事情 - 这是我在本地生成的 Rails 生成的数据库,没有指定排序规则,然后部署到赫罗库。这就是为什么它没有意义。
猜你喜欢
  • 1970-01-01
  • 2019-09-05
  • 1970-01-01
  • 2016-09-20
  • 2011-07-26
  • 2013-09-26
  • 2022-10-13
  • 2013-09-23
  • 2018-01-04
相关资源
最近更新 更多