Sqlite3 sortiert standardmäßig nur nach Ascii-Buchstaben. Ich habe versucht, in Google zu suchen, aber das einzige, was ich fand, waren Informationen über Kollatierungen. Sqlite3 hat nur NOCASE
, RTRIM
und BIARY
Kollationen. Wie kann ich Unterstützung für ein bestimmtes Gebietsschema hinzufügen? (Ich verwende es in Rails-Anwendung)Wie wird der Text in sqlite3 mit dem angegebenen Gebietsschema sortiert?
Antwort
SQLite supports Integration mit. Gemäß der Readme-Datei enthält das Verzeichnis sqlite/ext/icu/
Quellcode für die Erweiterung SQLite "ICU", eine Integration der Bibliothek "International Components for Unicode" mit 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
Ich nahm Doug Currie Antwort, aber ich möchte einige „Algorithmus“ hinzufügen, wie es zu tun, weil sqlite3 Dokumentation sehr seltsam ist (zumindest für mich).
Ok, wir haben Arbeit sqlite3 und jetzt:
es Kompilieren:
gcc -shared icu.c `icu-config --ldflags` -o libSqliteIcu.so
Es ist für Linux ist. Ich brauchte auch zusätzliche ICU Entwicklungspaket zu installieren:
sudo apt-get install libicu-dev
Ich bin auf 64-Bit-Architektur arbeiten und ich bekomme Fehler mit
__relocation R_X86_64_32S__
(was auch immer das bedeutet :). GCC schlug vor,-fPIC
hinzuzufügen, um Optionen zu kompilieren und es half.Run sqlite3. Wir können Erweiterung mit dem Befehl laden:
.load './libSqliteIcu.so'
Unter der Annahme, dass es im aktuellen Verzeichnis ist, können wir auch ganzen Pfad angeben.
erstellen neue Sortierung:
SELECT icu_load_collation('pl_PL', 'POLISH');
Der erste Parameter ist erwünscht, locale und das zweite ist, es ist (es was auch immer sein kann).
Jetzt können wir Daten mit unserem neuen locale sortieren:
SELECT * FROM some_table ORDER BY name COLLATE POLISH;
Und es ist Groß- und Kleinschreibung!
Wenn Sie es sich nicht leisten können, die ICU-Erweiterung zu kompilieren, können Sie eine UDF das gleiche tun lassen. In 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);
}
);
Beispiel Nutzung:
SELECT * FROM "table" ORDER BY locale("column", 'pt_PT');
Ich erwarte nicht, dieser Ansatz so effizient wie die native Erweiterung sein, aber es ist sicherlich mehr tragbar.
Der erste Link ist jetzt passwortgeschützt. –