Postgres Varchar比较文档



我有一个varchar字段,该字段有一个键,该键由字符串组成,有时有一些模式,以名称&时间戳。

我想支持删除具有给定前缀的旧记录,并且我想运行像DELETE FROM table WHERE key < %s这样的查询,但我想确切地知道我正在进入什么。我找不到任何关于这应该如何工作的官方文件。它们存在吗?我发现Practical Postgres书中提到它是基于字母顺序的,但我不确定在任何官方文档中是否仍然如此。除了我随便看看,还有什么最新的资料可以参考吗?

字符串根据libc strcmp函数执行的词法比较排序,使用由

指定的排序,按优先级降序排列:
  • 操作符上的显式COLLATEORDER BY
  • 上指定的任何COLLATE
  • 数据库默认的LC_COLLATE

(以上内容来自记忆,请查看手册以100%确定)

因此顺序根据您的语言环境而变化。例如,在某些地区,标点符号和/或空格会被忽略,按大小写排序也会有所不同。

您可以使用COLLATE "C"来覆盖DB的默认排序顺序,并按字符串的简单字节顺序排序。

所有的字符串排序——无论是否有区域设置排序——都是"愚蠢的",因为它们不识别数字、日期等。排序顺序不是人类通常会选择的。例如:

SELECT i
FROM generate_series(0,22) i
ORDER BY i::text COLLATE "C";
排放的

1
11
2
...
同样:

SELECT d
FROM (
  VALUES
  ('2001'),
  ('2000 A.D.'),
  ('600 B.C.')
) x(d)
ORDER BY d;

生产

 2000 A.D.
 2001
 600 B.C.

所以如果你想要一个自然的,或者人性化的排序,你需要更复杂——把字段分开,对每个部分排序。看到:

  • 字数混合字符串的人性化或自然数排序
  • PostgreSQL ORDER BY issue - natural sort

最新更新