2012-11-23 17 views
9

पायथन में एक स्क्रिप्ट काम नहीं करती है, और मैंने समस्या को निम्नानुसार कम कर दिया है।'पी 0' <'पी! 'पायथन और पोस्टग्रेस्क्ल

PostgreSQL 9.1 में मैंने कोशिश की:

SELECT 'P 0' < 'P! ' 
f 

और अजगर 2.7.3 में:

>>> 'P 0' < 'P! ' 
True 

' ' नहीं PostgreSQL में '!' की तुलना में कम क्यों है? क्या हो रहा है?

+3

चेक क्या अपने डेटाबेस का उपयोग कर रहा स्थान में। स्ट्रिंग तुलना वर्तमान लोकेल में संयोजन कैसे किया जाता है इस पर निर्भर करता है। – hammar

+0

मुझे यकीन है कि यह लोकेल की वजह से नहीं है। – kennytm

+1

@ केनीटीएम: कुछ स्थानीय लोग कॉलिंग करते समय रिक्त स्थान को अनदेखा करते हैं, जो इस मामले में अंतर को समझाएंगे। शेल में – hammar

उत्तर

7

PostgreSQL स्ट्रिंग तुलना के लिए आपके लोकेल के संयोजन नियमों का उपयोग कर रहा है। पाइथन संयोजन के लिए एक अलग लोकेल (संभवतः "सी") का उपयोग कर रहा है।

यह जानने के बिना और अधिक कहना मुश्किल है कि आपका डेटाबेस LC_COLLATE क्या है (\l+ से psql में) और पाइथन के लिए आपका रनटाइम वातावरण क्या है। डेटाबेस लोकेल और खोल locale कमांड के आउटपुट को दिखाने का प्रयास करें।

the PostgreSQL documentation on locales देखें।

उदाहरण के लिए, की तुलना और कॉन्ट्रास्ट:

-- results may vary depending on your OS/libc 
SELECT 'P 0' < 'P! ' COLLATE "C"; -- returns true 
SELECT 'P 0' < 'P! ' COLLATE "en_GB"; -- returns false 
+1

LC_COLLATE = 'es_CL.UTF-8' पोस्टग्रेस्क्ल और LC_COLLATE = "es_MX.UTF-8" में। –

3

आप कभी नहीं मान सकते कि स्ट्रिंग तुलना नियम दो अलग-अलग भाषाओं या प्रणालियों में समान हैं। सम्मेलन के असंख्य हैं; यह अच्छी तरह से परिभाषित नहीं है जैसे कि यह संख्याओं के साथ है। समानता सबसे अच्छी तरह से परिभाषित है, लेकिन यहां तक ​​कि आपको मतभेद भी मिलते हैं (पिछली जगहों को अनदेखा किया जा रहा है, मामला कोई फर्क नहीं पड़ता, आदि); पोर्टेबल के दायरे के बाहर असमान तारों का विशिष्ट क्रम तरीका है।

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