按字符的字节值对 Unicode 字符串进行排序

问题描述 投票:0回答:1

我使用的是 PostgreSQL 16,我的专栏的排序规则是

en_US.utf8
,如下所示:

create table t (a varchar(10) collate "en_US.utf8");

insert into t (a) values ('a'), ('b'),('{a'), ('{b'),
  ('{a{a'), ('{a{b'), ('{aa'), ('{ab');

然后,如果我按列排序

a

select * from t order by a;

我得到:

{a
a
{a{a
{aa
{a{b
{ab
{b
b

我期待 'a' 在 '{a' 之前,因为 'a' 的代码点为 97,而 '{' 的代码点为 123。

我需要使用不同的排序规则来进行 Unicode 排序吗?

我的用例使用更长的字符串,但我认为这个简单的示例说明了我遇到的问题。

sql database postgresql sorting unicode
1个回答
0
投票

要按编码的字节值排序,请使用

COLLATE "C"
。对于其他排序规则,如
en_US.utf8
,字节值大多无关紧要。
说明书:

C
(相当于
POSIX

C
POSIX
排序规则基于“传统 C”行为。它们按字节值而不是自然语言顺序排序, 并且只有 ASCII 字母“
A
”到“
Z
”被视为字母。 对于给定的所有版本,该行为都是高效且稳定的 数据库编码,但不同数据库之间的行为可能有所不同 编码。

CREATE TABLE t (a text COLLATE "C");

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.