Sqlite3 ordina di default solo le lettere ascii. Ho provato a cercare su google, ma l'unica cosa che ho trovato erano informazioni sulle collations. Sqlite3 ha solo NOCASE
, RTRIM
e BIARY
regole di confronto. Come aggiungere supporto per una locale specifica? (lo sto utilizzando nell'applicazione Rails)Come ordinare il testo in sqlite3 con le impostazioni locali specificate?
risposta
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
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:
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.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.
Creare nuove regole di confronto:
localeSELECT icu_load_collation('pl_PL', 'POLISH');
Il primo parametro è desiderato e il secondo è che è (può essere qualunque cosa).
Ora possiamo ordinare i dati con il nostro nuovo locale:
SELECT * FROM some_table ORDER BY name COLLATE POLISH;
ed è case insensitive!
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.
Il primo collegamento è protetto da password ora. –