ทำไม PostgreSQL ของฉันเรียงตามตัวพิมพ์เล็ก - ใหญ่


27

ฉันมี Postgres 9.4.4 ทำงานบน Debian และฉันได้รับORDER BYพฤติกรรมดังต่อไปนี้:

veure_test=# show LC_COLLATE;
 lc_collate  
-------------
 en_US.UTF-8
(1 row)

veure_test=# SELECT regexp_split_to_table('D d a A c b CD Capacitor', ' ') ORDER BY 1;
 regexp_split_to_table 
-----------------------
 a
 A
 b
 c
 Capacitor
 CD
 d
 D
(8 rows)

และuname -a:

Linux ---- 3.2.0-4-amd64 #1 SMP Debian 3.2.65-1 x86_64 GNU/Linux

อย่างไรก็ตามใน iMac ของฉันกับ Postgres 9.3.4 ฉันได้รับสิ่งต่อไปนี้:

veure_test=# show LC_COLLATE;
 lc_collate  
-------------
 en_US.UTF-8
(1 row)

veure_test=# SELECT regexp_split_to_table('D d a A c b CD Capacitor', ' ') ORDER BY 1;
 regexp_split_to_table 
-----------------------
 A
 CD
 Capacitor
 D
 a
 b
 c
 d
(8 rows)

และuname -a:

Darwin ---- 14.4.0 Darwin Kernel Version 14.4.0: Thu May 28 11:35:04 PDT 2015; root:xnu-2782.30.5~1/RELEASE_X86_64 x86_64

ฉันประหลาดใจด้วยสาเหตุที่รุ่น Debian ดูเหมือนจะไม่ตรงตามตัวพิมพ์เล็กและรุ่น OS X ไม่ใช่ ฉันจะพลาดอะไรหรือข้อมูลอื่น ๆ ที่ฉันจำเป็นต้องให้?

อัปเดต : บน Mac ของฉันpg_collationตารางแสดงฉันมีการen_US.UTF-8เปรียบเทียบ แต่บน Debian ฉันมีการen_US.utf8เปรียบเทียบ ดังนั้นบน Mac ของฉัน:

veure_test=# with foo as (
SELECT regexp_split_to_table('D d a A c b CD Capacitor', ' ') as bar
   )
SELECT bar FROM foo
ORDER BY bar collate "en_US.UTF-8";                                                                                                                                                                                      
    bar    
-----------
 A
 CD
 Capacitor
 D
 a
 b
 c
 d
(8 rows)

และบน Debian:

veure_test=# with foo as (
SELECT regexp_split_to_table('D d a A c b CD Capacitor', ' ') as bar
   )
SELECT bar FROM foo
ORDER BY bar collate "en_US.utf8";
    bar    
-----------
 a
 A
 b
 c
 Capacitor
 CD
 d
 D
(8 rows)

ดังนั้นen_US.UTF-8และen_US.utf8มีคำสั่งการเรียงลำดับที่แตกต่างกันอย่างไร


ฉันไม่มี Mac เพื่อทดสอบดังนั้นฉันจึงถ่ายภาพในที่มืดที่นี่ ... โอกาสใด ๆ ที่สตริง'D d a A c b CD Capacitor'จะไม่ถูกส่งเป็นtextฟิลด์บน Mac? IE ลองSELECT regexp_split_to_table('D d a A c b CD Capacitor'::text, ' ') ORDER BY 1;ดูว่าจะเกิดอะไรขึ้น ...
Chris Chris

ผลลัพธ์เดียวกัน ในข่าวอื่น ๆ ปรากฎว่าselect * from pg_collationการแสดง Debian กล่องมีen_US.utf8ในขณะที่ OS X en_US.UTF-8มี การใช้คำสั่งเหล่านั้นเพื่อบังคับการเรียงหน้าอย่างชัดเจนบนกล่องที่เกี่ยวข้องแสดงคำสั่งการเรียงลำดับที่แตกต่างกัน :(
Curtis Poe

และฉันได้โพสต์การอัปเดตซึ่งอาจอธิบายปัญหา แต่สำหรับฉันมันเป็นเพียงความลึกลับที่ลึกซึ้งยิ่งขึ้น และตอนนี้ฉันได้พบสิ่งนี้แล้ว: stackoverflow.com/questions/19967555/…และสิ่งนี้: stackoverflow.com/questions/27395317/…
Curtis Poe

7
น่าเสียดายที่ Postgres ใช้การปรับใช้การเรียงจาก OS ซึ่งทำให้ลักษณะการทำงานแบบนี้ขึ้นอยู่กับ OS (ซึ่งโดยส่วนตัวแล้วฉันคิดว่าเป็นข้อผิดพลาด - DBMS ควรทำงานเหมือนกันโดยไม่คำนึงถึงระบบปฏิบัติการ) ดังนั้นนี่จึงทำให้ความแตกต่างในไลบรารีระบบระหว่าง Debian และ OSX
a_horse_with_no_name

1
จะมีความขัดแย้งระหว่าง Postgres และส่วนอื่น ๆ ของระบบหากลำดับการจัดเรียงไม่สอดคล้องกับส่วนที่เหลือ ฉันก็ชอบพฤติกรรมที่เหมือนกัน แต่ฉันจะไม่เรียกมันว่าเป็นข้อผิดพลาดในการติดตามสถานที่ของระบบ ในที่สุดโลแคลที่เหมือนกันควรทำงานเหมือนกันทั่วทั้ง OS สถาน Debian ดูเหมือนไปทางขวา , แอปเปิ้ลน่าจะเป็นความผิด (ยกเว้นกรณีที่มีบางคำอธิบายอื่น ๆ )
Erwin Brandstetter

คำตอบ:


16

ดังนั้นen_US.UTF-8และen_US.utf8มีคำสั่งการเรียงลำดับที่แตกต่างกันอย่างไร

ไม่ทั้งสองแบบนี้เหมือนกันแค่แบบแผนการตั้งชื่ออื่น

ฉันประหลาดใจด้วยสาเหตุที่รุ่น Debian ดูเหมือนจะไม่ตรงตามตัวพิมพ์เล็กและรุ่น OS X ไม่ใช่

ใช่คุณถูกต้อง. นี่คือพฤติกรรมเริ่มต้นบน Mac การเรียงหน้าไม่ทำงานบน BSD-ish OS (รวมถึง OSX) ใด ๆ สำหรับการUTF8เข้ารหัส

นี่คือการอ้างอิงเพื่อพิสูจน์ว่า:

ปัญหาเกี่ยวกับการเรียงลำดับ (ตำแหน่งที่ตั้ง UTF8 ไม่ทำงาน

ดังที่a_horse_with_no_nameกล่าวว่า Postgres ใช้การจัดเรียงจาก OS ไม่มีทางที่จะได้ผลลัพธ์เดียวกันทั้งสองระบบปฏิบัติการ

ในกรณีของคุณคุณอาจ (ผมบอกว่าอาจจะ) ORDER BY lower(fieldname)ทำเช่นนี้


2
ใช้ความระมัดระวังในการตรวจสอบประสิทธิภาพเมื่อใช้ORDER BY function()กับ resultsets ที่มีขนาดใหญ่ - เพราะจะหยุดดัชนีที่ถูกใช้สำหรับการเรียงลำดับมันจะทำให้การดำเนินการเรียงลำดับพิเศษ (อาจเป็นดิสก์) และอาจเปลี่ยนวิธีการของนักวางแผนแบบสอบถาม .
David Spillett

@David Spillett: คุณพูดถูกเกี่ยวกับฟังก์ชั่นการสั่งซื้อ ฉันคิดว่าคำตอบของฉันให้ความสำคัญกับสาเหตุที่ OP มีการเรียงลำดับแฟชั่นที่แตกต่างใน iMac และ Debian ขอบคุณ
JSapkota

1
ใช่คำตอบของคุณสมบูรณ์ดีและครอบคลุมคำถามทั้งหมด การกล่าวถึง "การทดสอบด้วยข้อมูลจริงหลังจากการเปลี่ยนแปลงที่อาจส่งผลกระทบต่อแผนแบบสอบถาม" ได้กลายเป็นปฏิกิริยาที่เกิดขึ้นกับฉันแม้ว่า (เหมือนกับการทดสอบการพูดถึงการสำรองข้อมูลใด ๆ และอื่น ๆ ) เพราะมันง่ายที่จะลืม ไม่แม้แต่รู้ว่าในกรณีของคนที่ใหม่กว่าการทำงานของฐานข้อมูล
David Spillett
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.