Frage

Sqlite3 standardmäßig sortiert nur durch ASCII-Buchstaben. Ich habe versucht, in Google zu sehen, aber das einzige, was ich waren Informationen zu Sortierungen gefunden. Sqlite3 hat nur NOCASE, RTRIM und BIARY Sortierungen. Wie die Unterstützung für ein bestimmtes Gebietsschema hinzufügen? (Ich verwende es in Rails-Anwendung)

War es hilfreich?

Lösung

unterstützt Integration mit ICU . Laut der Readme-Datei, sqlite/ext/icu/README.txt das sqlite/ext/icu/ Verzeichnis enthält Quellcode für die SQLite „ICU“ -Erweiterung, ein Integration der "International Components for Unicode" Bibliothek 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

Andere Tipps

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:

  1. herunterladen ICU-Erweiterung für SQLite

  2. Kompilieren es:

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

    Es ist für Linux. Ich auch benötigt, um zusätzliches ICU Entwicklungspaket zu installieren:

    sudo apt-get install libicu-dev
    

    Ich arbeite an 64-Bit-Architektur, und ich bekomme Fehler mit __relocation R_X86_64_32S__ (was auch immer das bedeutet :). GCC vorgeschlagen -fPIC Hinzufügen von Optionen zu kompilieren und es half.

  3. Ausführen sqlite3. Wir können mit dem Befehl laden Erweiterung:

    .load './libSqliteIcu.so'
    

    Unter der Annahme, dass es im aktuellen Verzeichnis ist, können wir auch ganzen Pfad angeben.

  4. Erstellen Sie 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).

  5. 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 sich nicht leisten, die ICU Erweiterung kompilieren Sie das gleiche ein UDF zu tun haben kann. 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 glaube nicht, dieser Ansatz erwarte so effizient wie die native Erweiterung sein, aber es ist sicherlich mehr tragbar.

Für diejenigen, die nicht in der Lage sind die Erweiterung selbst zu bauen, habe ich kompilierten Versionen zur Verfügung gestellt für Mac OS und Linux hier: http://files.tempel.org/Various/Sqlite3ICUExtention

Die Linux-Versionen, sowohl für Intel 32 und 64 Bit, wurden auf Ubuntu 16 gebaut, wenn es ankommt.

Im Allgemeinen sollten Sie nicht Code von anderen geliefert zusammengestellt vertrauen, aber ich bin ganz eine öffentliche Person, das heißt, ich ziemlich Gefahr laufen würde, wenn ich eine „schlechte“ Version zur Verfügung stellen würde. Und um sicherzustellen, dass es kein Man-in-the-Middle-Angriff oder auf meinen Server getan Hack, hier sind die MD5-Hashes für die 3 Dateien:

libSqliteIcu-i386.so = 6decd73f27d9c61243128e798304508f
libSqliteIcu-x86_64.so = b127c8a1f65503c91c61a21732eb11be
sqlite3_icu_extension.dylib = a29d59f6b74e7ef234691729b82da660
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top