आपकी समस्या है 100% विंडोज़। (या बल्कि माइक्रोसॉफ्ट विजुअल स्टूडियो, जिसे पोस्टग्रेएसक्यूएल के साथ बनाया गया था, अधिक सटीक होने के लिए।)
रिकॉर्ड के लिए, SQL UPPER विंडोज़ को कॉल करना समाप्त होता है LCMapStringW
(towupper के ज़रिए
के माध्यम से str_toupper
) लगभग . के साथ सभी सही पैरामीटर (UTF-8 . के लिए स्थानीय भाषा 1055 तुर्की -एन्कोडेड, Turkish_Turkey डेटाबेस),
लेकिन
विजुअल स्टूडियो रनटाइम (towupper ) LCMAP_LINGUISTIC_CASING सेट नहीं करता है
LCMapStringW में थोड़ा सा के dwMapFlags . (मैं पुष्टि कर सकता हूं कि इसे सेट करना चाल है।) इसे Microsoft में बग नहीं माना जाता है; यह डिज़ाइन के अनुसार है, और शायद कभी भी "तय" नहीं होगा (ओह विरासत की खुशियाँ।)
आपके पास इससे तीन तरीके हैं:
- @Sorrow's Wrapper Solution लागू करें (या अपना खुद का नेटिव फंक्शन रिप्लेसमेंट (DLL) लिखें)
- अपना PostgreSQL इंस्टेंस उदा. उबंटू जो तुर्किक स्थानों के लिए सही व्यवहार प्रदर्शित करता है (@Sorrow ने पुष्टि की कि यह उसके लिए काम करता है); यह शायद सबसे आसान और साफ-सुथरा तरीका है।
- एक पैच किया गया 32-बिट
MSVCR100.DLLमें ड्रॉप करें आपके PostgreSQLbin. में निर्देशिका (लेकिन हालांकिUPPERऔरLOWERकाम करेगा, अन्य चीजें जैसे कि संयोजन विफल होना जारी रख सकता है - फिर से, विंडोज स्तर पर। वाईएमएमवी.)
पूर्णता के लिए (और पुरानी यादों का मज़ा) केवल , यहां विंडोज सिस्टम को पैच करने की प्रक्रिया है (लेकिन याद रखें, जब तक आप इस पोस्टग्रेएसक्यूएल इंस्टेंस को क्रैडल से कब्र तक प्रबंधित नहीं करेंगे, तब तक आप अपने उत्तराधिकारी को बहुत दुख दे सकते हैं); जब भी कोई नया परीक्षण या बैकअप सिस्टम तैनात किया जाता है स्क्रैच आपको या आपके उत्तराधिकारी को पैच को फिर से लागू करना याद रखना होगा - और यदि मान लें कि आप एक दिन पोस्टग्रेएसक्यूएल 10 में अपग्रेड करते हैं, जो कहते हैं कि MSVCR120.DLL का उपयोग करता है। MSVCR100.DLL . के बजाय , तो आपको नए डीएलएल को भी पैच करने के साथ अपना भाग्य आजमाना होगा।) एक परीक्षण प्रणाली पर
- HxD
का उपयोग करें खोलने के लिए
C:\WINDOWS\SYSTEM32\MSVCR100.DLL - डीएलएल को तुरंत उसी नाम से सहेजें, जिसे आप PostgreSQL
binके अंतर्गत रखते हैं निर्देशिका (एक्सप्लोरर या कमांड लाइन का उपयोग करके फ़ाइल की प्रतिलिपि बनाने का प्रयास न करें, वे 64 बिट संस्करण की प्रतिलिपि बना सकते हैं) - फ़ाइल अभी भी HxD में खुली हुई है, खोज> बदलें पर जाएं , डेटाटाइप:हेक्सवैल्यू pick चुनें , फिर
- खोजें......
4E 14 33 DB 3B CB 0F 84 41 12 00 00 B8 00 01 00 00 - इससे बदलें...
4E 14 33 DB 3B CB 0F 84 41 12 00 00 B8 00 01 00 01 - ...फिर एक बार और...
- खोजें......
FC 51 6A 01 8D 4D 08 51 68 00 02 00 00 50 E8 E2 - इससे बदलें...
FC 51 6A 01 8D 4D 08 51 68 00 02 00 01 50 E8 E2
- खोजें......
- ...और PostgreSQL
binके अंतर्गत पुनः सहेजें निर्देशिका, फिर PostgreSQL को पुनरारंभ करें और अपनी क्वेरी को फिर से चलाएँ।- यदि आपकी क्वेरी अभी भी काम नहीं करती है (सुनिश्चित करें कि आपका डेटाबेस UTF-8 है जो
Turkish_Turkeyके साथ एन्कोडेड है दोनोंLC_CTYPE. के लिए औरLC_COLLATE) खोलेंpostgres.exe32-बिट डिपेंडेंसी वॉकर में और सुनिश्चित करें कि यह इंगित करता है कि यह लोड होता हैMSVCR100.DLLPostgreSQLbin. से निर्देशिका। - यदि सभी कार्य अच्छी तरह से पैच किए गए DLL को उत्पादन PostgreSQL
binमें कॉपी करते हैं निर्देशिका और पुनरारंभ करें।
- यदि आपकी क्वेरी अभी भी काम नहीं करती है (सुनिश्चित करें कि आपका डेटाबेस UTF-8 है जो
लेकिन याद रखें, जिस क्षण आप डेटा को उबंटू सिस्टम से या पैच किए गए विंडोज सिस्टम को एक अनपेक्षित विंडोज सिस्टम पर ले जाते हैं, आपको फिर से समस्या होगी, और आप इस डेटा को उबंटू पर वापस आयात करने में असमर्थ हो सकते हैं यदि विंडोज इंस्टेंस ने डुप्लिकेट पेश किया एक citext फ़ील्ड या UPPER . में /LOWER -आधारित फ़ंक्शन इंडेक्स।