केस-असंवेदनशील होने के कारण मेरा PostgreSQL ORDER क्यों है?


27

मेरे पास Degr पर 9.4.4 Postgres हैं और मुझे निम्नलिखित 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 पर, पोस्टग्रेज 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

मैं इस बात से हैरान हूं कि डेबियन संस्करण केस-असंवेदनशील क्यों प्रतीत होता है और ओएस एक्स संस्करण नहीं है। मुझे क्या याद आ रहा है, या मुझे कौन सी अन्य जानकारी प्रदान करने की आवश्यकता है?

अपडेट : मेरे मैक पर, pg_collationतालिका से पता चलता है कि मेरा एक en_US.UTF-8टकराव है, लेकिन डेबियन पर, मेरा एक en_US.utf8टकराव है। इस प्रकार, मेरे मैक पर:

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)

और डेबियन पर:

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विभिन्न प्रकार के आदेश हैं?


मेरे पास परीक्षण करने के लिए मैक नहीं है, इसलिए मैं यहां अंधेरे में शूटिंग कर रहा हूं ... कोई भी मौका जो स्ट्रिंग 'D d a A c b CD Capacitor'को textमैक पर एक क्षेत्र के रूप में नहीं डाला जा रहा है ? IE, कोशिश करो SELECT regexp_split_to_table('D d a A c b CD Capacitor'::text, ' ') ORDER BY 1;और देखो क्या होता है ...
क्रिस

एक ही परिणाम। अन्य समाचारों में, पता select * from pg_collationचलता है कि डेबियन बॉक्स में दिखाया गया है en_US.utf8, जबकि ओएस एक्स में है en_US.UTF-8। संबंधित बक्सों पर स्पष्ट रूप से बल टकराने का उपयोग करने से विभिन्न प्रकार के आदेश दिखाई देते हैं :(
कर्टिस पो

और मैंने एक अपडेट पोस्ट किया है जो समस्या की व्याख्या कर सकता है, लेकिन मेरे लिए, यह केवल रहस्य को गहरा करता है। और मुझे अब यह मिल गया है: stackoverflow.com/questions/19967555/… और यह: stackoverflow.com/questions/27395317/…
कर्टिस पो

7
दुर्भाग्य से Postgres OS से टकराव के कार्यान्वयन का उपयोग करता है जो इस तरह के व्यवहार को OS निर्भर करता है (जिसे मैं व्यक्तिगत रूप से बग मानता हूं - DBMS को OS की परवाह किए बिना समान व्यवहार करना चाहिए)। इसलिए यह डेबियन और OSX के बीच सिस्टम लाइब्रेरी में अंतर को
उबालता है

1
पोस्टग्रेज और सिस्टम के अन्य हिस्सों के बीच असहमति होगी यदि क्रम क्रम बाकी के अनुरूप नहीं होता है। मैं भी समान व्यवहार को प्राथमिकता देता हूं, लेकिन मैं इसे सिस्टम लोकेल का पालन करने के लिए बग नहीं कहूंगा। अंततः, समान स्थानों को OS के पार पहचान में व्यवहार करना चाहिए। डेबियन स्थान सही लगता है , एप्पल की गलती होने के लिए (जब तक वहाँ कुछ अन्य विवरण है) लगता है।
इरविन ब्रान्डसेट्टर

जवाबों:


16

तो en_US.UTF-8और en_US.utf8विभिन्न प्रकार के आदेश हैं?

नहीं, ये दोनों समान हैं, बस एक अलग नामकरण सम्मेलन है।

मैं इस बात से हैरान हूं कि डेबियन संस्करण केस-असंवेदनशील क्यों प्रतीत होता है और ओएस एक्स संस्करण नहीं है।

हाँ आप सही हैं। यह मैक पर डिफ़ॉल्ट व्यवहार है। UTF8एन्कोडिंग के लिए किसी भी BSD-ish OS (incl। OSX) पर कोलाज काम नहीं करता है ।

यहाँ यह साबित करने के लिए एक संदर्भ है कि:

क्रमबद्ध क्रम में समस्याएँ (UTF8 स्थान काम नहीं करते हैं

जैसा कि a_horse_with_no_name ने कहा, Postgres OS से टकराव कार्यान्वयन का उपयोग करता है। दोनों ऑपरेटिंग सिस्टम पर समान परिणाम प्राप्त करने का कोई तरीका नहीं है।

आपके मामले में आप (मैंने कहा हो सकता है) ऐसा करते हैं ORDER BY lower(fieldname):।


2
ORDER BY function()संभावित बड़े परिणाम पर उपयोग करते समय प्रदर्शन को सत्यापित करने के लिए ध्यान रखें - क्योंकि यह एक सूचकांक को रोकता है जिस तरह के लिए इसका उपयोग किया जा रहा है यह लगभग निश्चित रूप से एक अतिरिक्त प्रकार के ऑपरेशन (संभवतः डिस्क पर) का कारण होगा और यह क्वेरी के योजनाकार की विधि को आपकी क्वेरी पर अधिक व्यापक रूप से बदल सकता है। ।
डेविड स्पिललेट

@ डेविड स्पिलेट: आप ऑर्डर फ़ंक्शन के बारे में सही हैं। मुझे लगता है कि मेरा जवाब इस बात पर अधिक केंद्रित है कि क्यों ओपी आईमैक और डेबियन में अलग-अलग छंटनी कर रहा है। धन्यवाद
JSapkota

1
हां, आपका उत्तर पूरी तरह से ठीक है और प्रश्न को पूरी तरह से कवर करता है। "परिवर्तन के बाद वास्तविक डेटा के साथ परीक्षण करना जो क्वेरी प्लान को प्रभावित कर सकता है" का उल्लेख करना मेरे लिए एक आदतन प्रतिक्रिया बन गया है (हालांकि बैकअप की किसी भी चर्चा में परीक्षण का उल्लेख करना, और आगे की तरह) क्योंकि इसे भूलना आसान है (और लोग अक्सर करते हैं) या डेटाबेस काम करने के लिए नए लोगों के मामले में भी नहीं पता है।
डेविड स्पिललेट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.