簡體   English   中英

為什么 PostgreSQL 對部分區分大小寫和部分不區分大小寫進行排序?

[英]Why does PostgreSQL sort part case-sensitively and part case-insensitively?

我無法理解 PostgreSQL (v11.10) 的行為。 這是我所做的:

create temp table test (first_name text, last_name text);
insert into test values
  ('Hanna', 'Beat'),
  ('JOAN', 'BEET'),
  ('Mark', 'Bernstein'),
  ('ALFRED', 'DOE'),
  ('henry', 'doe'),
  ('Henry', 'Doe'),
  ('Dennis', 'Doe');
select last_name, first_name from test order by last_name, first_name;

這就是我得到的。

 last_name | first_name 
-----------+------------
 Beat      | Hanna
 BEET      | JOAN
 Bernstein | Mark
 doe       | henry
 Doe       | Dennis
 Doe       | Henry
 DOE       | ALFRED
(7 rows)

看起來前三個名稱的排序不區分大小寫,但后四個名稱的排序區分大小寫。 為什么?

換句話說,如果排序區分大小寫,我希望順序如下:

 last_name | first_name 
-----------+------------
 Beat      | Hanna
 Bernstein | Mark
 BEET      | JOAN
 doe       | henry
 Doe       | Dennis
 Doe       | Henry
 DOE       | ALFRED
(7 rows)

如果它不區分大小寫,我希望這樣:

 last_name | first_name 
-----------+------------
 Beat      | Hanna
 BEET      | JOAN
 Bernstein | Mark
 DOE       | ALFRED
 Doe       | Dennis
 doe       | henry
 Doe       | Henry
(7 rows)

相反,我得到的是兩者的混合,這讓我感到困惑......

為了完整性:

# show lc_collate; show lc_ctype;
 lc_collate  
-------------
 en_US.UTF-8
(1 row)

  lc_ctype   
-------------
 en_US.UTF-8
(1 row)

自然語言排序比你想象的要復雜。 他們使用不同的比較級別,當字符串在較低級別比較相等時,較高級別用作決勝局。 通常,在初級階段忽略重音和大小寫。 在中學階段,重音得到尊重,但大小寫被忽略。 在第三級,大小寫和口音受到尊重。

因此,字符串Etatétatetat在主要級別上比較相同。 在中等水平上, état將大於其他兩個,這將是相等的。 在高等教育層面, etat將小於Etat 總而言之,我們最終得到

'etat' < 'Etat' < 'état'

大寫字符大於小寫字符有點隨意,使用 ICU 排序規則,您可以配置大部分這些方面。

在您的示例中, BEET在初級級別上低於Bernstein ,因此這就是字符串排序的順序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM