【问题标题】:Strange ORDER BY order in PostgreSQLPostgreSQL 中奇怪的 ORDER BY 顺序
【发布时间】:2013-02-21 19:13:08
【问题描述】:
SELECT vm.value FROM vm ORDER BY vm.value ASC;

结果:

.
0
0%
0.0
0.964
%.0f
%.0f mph
-1.0°
11/1
11-14-1981
112 mph
11:48:43
%1$.1f mph %2$@
1/2
12.5˚
1/4
195 lb
%.1f°
2 days ago
%.2f
2º out-in
3/4
3.5
3.6
3D
3 days ago
4º closed
5'10''
5”10”
Account

我记得 ASCII/Unicode 数字应该紧跟在一起,而不是与百分比和其他字符交替。

【问题讨论】:

  • 看起来百分比、点和其他特殊字符在比较过程中被忽略了。
  • vm.value的列类型是什么?
  • @Joachim Isaksson:字符变化(1000)
  • 由于排序由您的区域设置,您的区域设置是什么?尝试切换到 C 语言环境,看看是否会改变它。
  • 我认为 ORDER BY 应该是通用的、独立于语言环境的,就像 Unicode 本身一样。顺便说一句:如何更改/查看语言环境?

标签: postgresql sql-order-by postgresql-9.1


【解决方案1】:

我记得 ASCII/Unicode 数字应该彼此跟随 紧密不与百分比和其他字符交替。

这适用于某些语言环境,但不适用于其他语言环境。显然它不适用于您正在使用的那个。在 SQL 中发出 show lc_collate 以查看正在使用的语言环境。

对于最新版本的 PG,包括 9.1,您可以使用每个查询特定的语言环境进行排序,如下所示:

SELECT vm.value FROM vm ORDER BY vm.value COLLATE "C";

对于问题中显示的具体数据,这将按您的预期排序。

【讨论】:

  • en_US.UTF-8 以问题描述的方式排序。人们会认为排序规则不会忽略非字母数字。
  • 是的,我使用的是 en_US.UTF-8
  • @JoachimIsaksson en_US.UTF-8 整理顺序记录在哪里?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-03
  • 2021-05-28
  • 2014-10-12
  • 1970-01-01
  • 2012-09-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多