2013-05-30 3 views
6

मैं cs_CZ (चेक) के लिए सेट मिलान के साथ एक मेज है:PostgreSQL अनुचित तरीके से चेक मिलान के साथ यूनिकोड वर्ण सॉर्ट करता

Name | Encoding | Collation | CType 
-----------+----------+-------------+------------- 
foo  | UTF8  | cs_CZ.UTF-8 | cs_CZ.UTF-8 

लेकिन जब मैं स्ट्रिंग द्वारा आदेश, परिणाम के रूप में यह चेक वर्णमाला के अनुसार किया जाना चाहिए पृथक नहीं किया जा रहा है :

=> SELECT surname FROM foo ORDER BY surname; 
    surname  
----------------- 
A 
Da 
Ďb 
Dc 
E 

तो यह की तरह है, तो यूनिकोड लहजे चरित्र (घ) के बिना लहजे (डी) अपने ASCII संस्करण के लिए परिवर्तित कर दिया गया क्रमबद्ध किया जाता है। लेकिन चेक वर्णमाला है: ... सी -> डी -> Ď -> ई ..., इसलिए लौटाया गया आदेश गलत है (इस उदाहरण में यह होना चाहिए: ए -> दा -> डीसी -> Ďb -> ई)।

क्या यह सामान्य PostgreSQL व्यवहार है? क्या चेक तरीका वर्णमाला के अनुसार सही तरीके से सॉर्ट किया गया है?

संपादित करें: पोस्टग्रेज़ पर प्रयास किया 9.1.4, दोनों का एक ही व्यवहार है। यह एक आर्क लिनक्स मशीन है।
EDIT2: समायोजित उदाहरण, Ď वास्तविक समस्या है।

+1

कृपया हमें बताएं कि आप किस पोस्टग्रेएसक्यूएल का उपयोग कर रहे हैं। –

+0

बस मौका में, क्या आप PostgreSQL 9.1 या अधिक हालिया संस्करण पर होते हैं? यदि हां, तो आपके * foo * तालिका में * उपनाम * कॉलम एक अलग संयोजन पर सेट है? –

+0

क्षमा करें, यह पोस्टग्रेज़ 9.1.4 है और यह 9.2.4 पर समान है। प्रश्न अपडेट किया गया। और नहीं, कोई स्तंभ-विशिष्ट संयोजन नहीं है। –

उत्तर

4

यह सही है। ए, डी, ई, ई, मैं, एन, ó, टी, यू, यू, वाई अनदेखा किया जाना चाहिए देखने article

चेक तरह नियम थोड़ा जटिल :)

3

PostgreSQL के पास अपने स्वयं के सॉर्ट नियम नहीं हैं, यह ऑपरेटिंग सिस्टम द्वारा प्रदान किए गए नियमों का उपयोग करता है। यदि आप उसी लोकेल के साथ /usr/bin/sort के साथ प्रयास करते हैं, तो आपको वही सॉर्ट ऑर्डर मिल जाएगा।

यहाँ अपने नमूना डेटा के साथ परिणाम है जब Ubuntu 12.04, PostgreSQL 9.1 के साथ करने की कोशिश की:

create COLLATION cs_CZ (locale="cs_CZ.UTF-8"); 
select * from (values('Ca'),('Čb'),('Cc')) as l(a) order by a collate cs_CZ; 

परिणाम:

 
a 
---- 
Ca 
Cc 
Čb 
(3 rows) 

सूचना है कि जैसा कि आप कहते हैं कि यह होना चाहिए यह हल कर रहा है।

यदि आपका ऑपरेटिंग सिस्टम अलग-अलग प्रकार से है और आप सुनिश्चित हैं कि यह आधिकारिक चेक नियमों के अनुसार गलत है, तो यह अपने चेक लोकेल कार्यान्वयन में एक बग है।

अद्यतन टिप्पणी निम्नलिखित:

SELECT * FROM (values('A'),('Da'),('Ďb'),('Dc'),('E')) AS l(a) 
    ORDER BY a COLLATE cs_CZ; 

परिणामों में:

 
a 
---- 
A 
Da 
Ďb 
Dc 
E 
+0

मुझे खेद है, उदाहरण के लिए मैंने वास्तव में काम किया था - मैंने गलती से माना कि यह सभी अक्षरों को प्रभावित करता है। समस्या पत्र डी (Ď) के साथ है। क्या आप कृपया इस सेट के साथ प्रयास कर सकते हैं: '' चुनें * से चुनें (मान ('ए'), ('दा'), ('Ďb'), ('डीसी'), ('ई')) एएस एल (ए) एक कैलेंडर cs_CZ द्वारा आदेश; '' ''? तब परिणाम क्या है? –

1

चेक मिलान में छँटाई कर रहे हैं के लिए एक्सेंट है czech grammar rules!

पात्र एक तरह से सही, डी, ई, ई, मैं, एन, ó, टी, यू, यू, वाई जैसे वे विराम चिह्न तो परिणाम नहीं है हल कर रहे हैं:

ए, दा, Ďb, डीसी, ई चेक व्याकरण द्वारा corret है।

स्लोवाक और चेक के लिए यह पागल लगता है, लेकिन "नियमों के रूप में नियम"।

अन्य नियम स्पैनिश भाषा (collate sk_SK) के लिए हैं जहां पात्र डी-ď, टी-ť, एन-एनएन, एल-ľ इस मामले में चेक Ď जैसे वर्णमाला क्रम में हैं।

संबंधित मुद्दे