समस्या की जड़ यहाँ स्थित है:
<ब्लॉकक्वॉट>मैं विकास के लिए SQLite3 और परिनियोजन के लिए PostgreSQL का उपयोग कर रहा हूं।
यह एक बुरा विचार है™। आप असंगतताओं में भागते रहेंगे - या इससे भी बदतर:नुकसान होने तक कुछ का एहसास नहीं होता है।
विकास और उत्पादन के लिए उसी RDBMS (PostgreSQL) का उपयोग करें और अपने आप को व्यर्थ की परेशानी से बचाएं।
जब आप अपने दुर्भाग्यपूर्ण सेटअप के साथ फंस गए हैं, तो एक साधारण समाधान . है :
lower(style) LIKE lower(?)
दोनों प्लेटफॉर्म पर समान रूप से काम करता है।
-
आप दाहिनी ओर
lower()
drop छोड़ सकते हैं , यदि आप लोअर-केस खोज-पैटर्न प्रदान करते हैं। -
मानक SQLite में
<ब्लॉकक्वॉट>lower(X)
केवल ASCII अक्षरों को फोल्ड करता है। अधिक के लिए, मैं SQLite मैनुअल में अध्याय कोर फ़ंक्शंस उद्धृत करता हूं:निचला (एक्स) फ़ंक्शन स्ट्रिंग एक्स की एक प्रति देता है जिसमें सभी ASCII वर्णों को निचले मामले में परिवर्तित किया जाता है। डिफ़ॉल्ट अंतर्निहित निचला () फ़ंक्शन केवल ASCII वर्णों के लिए काम करता है। गैर-ASCII वर्णों पर केस रूपांतरण करने के लिए, ICU एक्सटेंशन लोड करें ।
मेरा जोर।
-
PostgreSQL
lower(X)
UTF-8 आउट ऑफ़ द बॉक्स के साथ काम करता है।
एक स्वागत योग्य दुष्प्रभाव के रूप में, आप गति . कर सकते हैं पोस्टग्रेएसक्यूएल में उस क्वेरी को अभिव्यक्ति पर एक इंडेक्स के साथ lower(style)
, जो ILIKE
. का उपयोग करने से तेज़ होगा और style
. पर एक बुनियादी अनुक्रमणिका .
साथ ही, PostgreSQL 9.1 के बाद से आप pg_trgm
के साथ GIN या GIST अनुक्रमणिका का उपयोग कर सकते हैं कोई भी . को गति देने के लिए एक्सटेंशन LIKE
और ILIKE
क्वेरी - ट्रिगर केस-असंवेदनशील होते हैं। इस संबंधित उत्तर में विस्तृत निर्देश और लिंक:
- स्वतः पूर्ण फ़ील्ड के लिए समान UTF-8 स्ट्रिंग्स