2009-03-04 5 views

Répondre

13

SQLite supports intégration avec ICU. Selon le fichier Lisez-moi, sqlite/ext/icu/README.txt le répertoire sqlite/ext/icu/ contient le code source de l'extension SQLite "ICU", une intégration de la bibliothèque "International Components for Unicode" avec 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

Le premier lien est protégé par mot de passe maintenant. –

23

j'ai accepté réponse Doug Currie, mais je veux ajouter un peu de « algorithme » comment le faire, parce que la documentation sqlite3 est très étrange (au moins pour moi).

Ok, nous avons travaillé sqlite3 et maintenant:

  1. Download ICU extension for sqlite

  2. compiler:

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

    Il est pour Linux. J'ai aussi besoin d'installer le paquet supplémentaire de développement de soins intensifs:

     
    sudo apt-get install libicu-dev 
    

    Je travaille sur 64 bits et l'architecture que j'obtiens l'erreur avec __relocation R_X86_64_32S__ (tout cela signifie :). GCC a suggéré d'ajouter -fPIC pour compiler les options et cela a aidé.

  3. Exécutez sqlite3. On peut charger l'extension avec la commande:

     
    .load './libSqliteIcu.so' 
    

    Si l'on suppose qu'il est dans le répertoire courant, on peut aussi spécifier le chemin entier.

  4. Créer nouveau classement:

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

    Le premier paramètre est souhaité locale et le second est qu'il est (il peut être tout).

  5. Maintenant, nous pouvons trier les données avec notre nouveau lieu:

     
    SELECT * FROM some_table ORDER BY name COLLATE POLISH; 
    

    Et il est insensible à la casse!

1

Si vous ne pouvez pas vous permettre de compiler l'extension ICU, vous pouvez faire en sorte qu'une UDF fasse de même. En PHP/AOP:

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

Exemple d'utilisation:

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

Je ne pense pas que cette approche soit aussi efficace que l'extension native, mais il est certainement plus facile à transporter.

Questions connexes