2009-03-04 5 views
13

एसक्लाइट 3 डिफ़ॉल्ट रूप से केवल एसीआई अक्षरों द्वारा। मैंने Google में देखने की कोशिश की, लेकिन मुझे मिली एकमात्र चीज collations के बारे में जानकारी थी। स्क्लाइट 3 में केवल NOCASE, RTRIM और BIARY कॉलेशन हैं। एक विशिष्ट लोकेल के लिए समर्थन कैसे जोड़ें? (मैं इसे रेल एप्लिकेशन में उपयोग कर रहा हूं)निर्दिष्ट लोकेल के साथ sqlite3 में पाठ को सॉर्ट करने के लिए कैसे?

उत्तर

13

SQLite supportsICU के साथ एकीकरण। रीडेमे फ़ाइल के अनुसार, sqlite/ext/icu/README.txt sqlite/ext/icu/ निर्देशिका में SQLite "आईसीयू" एक्सटेंशन के लिए स्रोत कोड, SQLite के साथ "यूनिकोड के लिए अंतर्राष्ट्रीय घटक" लाइब्रेरी का एकीकरण शामिल है।

1. Features 

    1.1 SQL Scalars upper() and lower() 
    1.2 Unicode Aware LIKE Operator 
    1.3 ICU Collation Sequences 
    1.4 SQL REGEXP Operator 
+1

पहला लिंक अब पासवर्ड-सुरक्षित है। –

23

मैं डौग करी जवाब स्वीकार किए जाते हैं, लेकिन मैं, कुछ "एल्गोरिथ्म" इसे कैसे करना जोड़ने के लिए क्योंकि sqlite3 प्रलेखन बहुत ही अजीब है (कम से कम मेरे लिए) चाहते हैं।

ठीक है, हम sqlite3 काम कर रहा है और अब:

  1. Download ICU extension for sqlite

  2. यह संकलित करें:

     
    gcc -shared icu.c `icu-config --ldflags` -o libSqliteIcu.so 
    

    यह लिनक्स के लिए है। मैं भी अतिरिक्त आईसीयू विकास पैकेज स्थापित करने की जरूरत:

     
    sudo apt-get install libicu-dev 
    

    मैं 64 बिट वास्तुकला पर काम कर रहा हूँ और मैं (__relocation R_X86_64_32S__ साथ त्रुटि मिलती है जो कुछ भी यह :) का मतलब है। जीसीसी ने विकल्पों को संकलित करने के लिए -fPIC जोड़ने का सुझाव दिया और इससे मदद मिली।

  3. रन sqlite3। हम कमांड के साथ एक्सटेंशन लोड कर सकते हैं:

     
    .load './libSqliteIcu.so' 
    

    मानते हैं कि यह वर्तमान निर्देशिका में है, हम पूरे पथ को भी निर्दिष्ट कर सकते हैं।

  4. नए मिलान बनाएँ:

     
    SELECT icu_load_collation('pl_PL', 'POLISH'); 
    

    पहले पैरामीटर वांछित है लोकेल और दूसरा यह (यह जो कुछ भी हो सकता है) है।

  5. अब हम अपने नए वातावरण के साथ डेटा को सॉर्ट कर सकते हैं:

     
    SELECT * FROM some_table ORDER BY name COLLATE POLISH; 
    

    और यह केस संवेदी है!

1

यदि आप आईसीयू एक्सटेंशन को संकलित करने का जोखिम नहीं उठा सकते हैं तो आप एक यूडीएफ कर सकते हैं।

$pdo->sqliteCreateFunction('locale', 
    function ($data, $locale = 'root') 
    { 
     static $collators = array(); 

     if (isset($collators[$locale]) !== true) 
     { 
      $collators[$locale] = new \Collator($locale); 
     } 

     return $collators[$locale]->getSortKey($data); 
    } 
); 

उदाहरण उपयोग: PHP/पीडीओ में

SELECT * FROM "table" ORDER BY locale("column", 'pt_PT'); 

मैं इस दृष्टिकोण देशी विस्तार के रूप में के रूप में कुशल होने की उम्मीद नहीं है, लेकिन यह निश्चित रूप से अधिक पोर्टेबल है।

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