आपकी समस्या है 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.exe
32-बिट डिपेंडेंसी वॉकर में और सुनिश्चित करें कि यह इंगित करता है कि यह लोड होता हैMSVCR100.DLL
PostgreSQLbin
. से निर्देशिका। - यदि सभी कार्य अच्छी तरह से पैच किए गए DLL को उत्पादन PostgreSQL
bin
में कॉपी करते हैं निर्देशिका और पुनरारंभ करें।
- यदि आपकी क्वेरी अभी भी काम नहीं करती है (सुनिश्चित करें कि आपका डेटाबेस UTF-8 है जो
लेकिन याद रखें, जिस क्षण आप डेटा को उबंटू सिस्टम से या पैच किए गए विंडोज सिस्टम को एक अनपेक्षित विंडोज सिस्टम पर ले जाते हैं, आपको फिर से समस्या होगी, और आप इस डेटा को उबंटू पर वापस आयात करने में असमर्थ हो सकते हैं यदि विंडोज इंस्टेंस ने डुप्लिकेट पेश किया एक citext
फ़ील्ड या UPPER
. में /LOWER
-आधारित फ़ंक्शन इंडेक्स।