2009-03-04 13 views

Odpowiedz

13

SQLite supports integracja z ICU. Zgodnie z plikiem Readme, katalog sqlite/ext/icu/README.txt zawiera kod źródłowy dla rozszerzenia "ICU" SQLite, integrację biblioteki "International Components for Unicode" z 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

Pierwsze łącze jest teraz chronione hasłem. –

23

przyjąłem Doug Currie odpowiedź, ale chcę dodać trochę „algorytm”, jak to zrobić, ponieważ sqlite3 dokumentacja jest bardzo dziwne (przynajmniej dla mnie).

Ok, mamy sqlite3 pracę i teraz:

  1. Download ICU extension for sqlite

  2. skompilować:

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

    Jest dla systemu Linux. Musiałem także zainstalować dodatkowy pakiet rozwojowy ICU:

     
    sudo apt-get install libicu-dev 
    

    pracuję na 64-bitowej architekturze i otrzymuję błąd z __relocation R_X86_64_32S__ (cokolwiek to znaczy :). GCC zasugerowało dodanie -fPIC do kompilacji opcji i pomogło.

  3. Uruchom sqlite3. Możemy załadować rozszerzenie poleceniem:

     
    .load './libSqliteIcu.so' 
    

    Zakładając, że znajduje się on w katalogu bieżącym, możemy również podać całą ścieżkę.

  4. Utwórz nowe sortowania:

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

    pożądany jest pierwszy parametr locale a drugi to (może być cokolwiek).

  5. Teraz możemy posortować dane z naszej nowej lokalizacji:

     
    SELECT * FROM some_table ORDER BY name COLLATE POLISH; 
    

    I to jest sprawa niewrażliwe!

1

Jeśli nie możesz sobie pozwolić na kompilację rozszerzenia ICU, możesz zrobić to samo z UDF. W PHP/PDO:

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

Przykład użycia:

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

nie spodziewam się to podejście będzie tak skuteczny jak natywnego rozszerzenia ale na pewno jest bardziej mobilny.

Powiązane problemy