2009-03-04 11 views

risposta

13

SQLite supports integrazione con ICU. Secondo il file Leggimi, sqlite/ext/icu/README.txt la directory sqlite/ext/icu/ contiene il codice sorgente per l'estensione "ICU" di SQLite, un'integrazione della libreria "International Components for Unicode" con 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

Il primo collegamento è protetto da password ora. –

23

ho accettato Doug Currie risposta, ma voglio aggiungere un po ' "algoritmo" come farlo, perché sqlite3 documentazione è molto strano (almeno per me).

Ok, abbiamo lavorato sqlite3 e ora:

  1. Download ICU extension for sqlite

  2. compilarlo:

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

    E 'per Linux. Ho anche bisogno di installare ulteriori pacchetto di sviluppo ICU:

     
    sudo apt-get install libicu-dev 
    

    sto lavorando su architettura a 64 bit e ottengo l'errore con __relocation R_X86_64_32S__ (qualsiasi cosa voglia dire :). GCC ha suggerito di aggiungere -fPIC per compilare le opzioni e ha aiutato.

  3. Eseguire sqlite3. Siamo in grado di caricare l'estensione con il comando:

     
    .load './libSqliteIcu.so' 
    

    Supponendo che sia nella directory corrente, possiamo anche specificare tutto il percorso.

  4. Creare nuove regole di confronto:

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

    Il primo parametro è desiderato e il secondo è che è (può essere qualunque cosa).

  5. Ora possiamo ordinare i dati con il nostro nuovo locale:

     
    SELECT * FROM some_table ORDER BY name COLLATE POLISH; 
    

    ed è case insensitive!

1

Se non puoi permetterti di compilare l'estensione ICU, puoi fare in modo che l'UDF faccia lo stesso. In PHP/DOP: l'utilizzo

$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); 
    } 
); 

Esempio:

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

Non mi aspetto che questo approccio sia il più efficiente l'estensione nativa ma è sicuramente più portabile.