PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

तुर्की चरित्र पर ऊपरी कार्य पोस्टग्रेज अपेक्षित परिणाम नहीं देता है

आपकी समस्या है 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 में ड्रॉप करें आपके PostgreSQL bin . में निर्देशिका (लेकिन हालांकि 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 PostgreSQL bin . से निर्देशिका।
    • यदि सभी कार्य अच्छी तरह से पैच किए गए DLL को उत्पादन PostgreSQL bin में कॉपी करते हैं निर्देशिका और पुनरारंभ करें।

लेकिन याद रखें, जिस क्षण आप डेटा को उबंटू सिस्टम से या पैच किए गए विंडोज सिस्टम को एक अनपेक्षित विंडोज सिस्टम पर ले जाते हैं, आपको फिर से समस्या होगी, और आप इस डेटा को उबंटू पर वापस आयात करने में असमर्थ हो सकते हैं यदि विंडोज इंस्टेंस ने डुप्लिकेट पेश किया एक citext फ़ील्ड या UPPER . में /LOWER -आधारित फ़ंक्शन इंडेक्स।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL:ST_GeomFromText(अज्ञात) मौजूद नहीं है

  2. मैन्युअल रूप से रिलीज़ पोस्टग्रेज़ LOCK

  3. पिछले 3 घंटे का समय लें और 5 मिनट तक समूहित करें

  4. Postgresql में अजीब व्यवहार

  5. रेल में सभी तालिकाओं को छोटा करने के लिए रेक कार्य 3