Sortierreihenfolge SQLite

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
snowflake
User
Beiträge: 93
Registriert: Mittwoch 9. November 2016, 15:46

Guten Morgen,

ich habe ein riesen Problem mit der Sortierreihenfolge bei der Verwendung von SQLite. In der Datenbank befinden sich u. a. Namen wie folgt:

Beispiele:
Krämer
Krames


Wenn ich eine Datenbankabfrage wie folgt durchführe, wird der Name Krämer hinter dem Namen Krames einsortiert. Üblich ist aber die umgekehrte Reihenfolge (Umlaute kommen zuerst).

Code: Alles auswählen

SELECT Name From Benutzer ORDER BY Name
(ASC bzw DESC evtl. noch)

Soweit ich das im Internet nachvollziehen konnte, liegt das wohl am ASCII-Code. Ich bekomme das Problem aber irgendwie nicht zu greifen, trotz zahlreicher hinweise im Internet. Liegt die Lösung in der SQL-Abfrage oder muss ich das Problem mit Python lösen?

Vielen Dank

snowflake
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

„Üblich“ ist relativ. Ich hätte ä nach a sortiert. Die Schweden packen ihre Umlaute sogar hinter z. Das ist also alles ziemlich kompliziert, wie man auch hier sieht: https://de.wikipedia.org/wiki/Alphabetische_Sortierung

Was du tun musst ist SQLite eine collation Funktion zu geben, die deine gewünschte Sortierung herstellt: https://stackoverflow.com/questions/376 ... th-umlauts
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Die Sortierreihenfolge ist keine einfache Sache, denn sie unterscheidet sich von Land zu Land, z.B. zwischen Deutschland und Österreich: Alphabetische Sortierung

Das Problem nennt sich COLLATION und wird von SQLite nicht direkt unterstützt, sondern braucht eine Extension: https://www.sqlite.org/src/dir?ci=a62e6 ... cu]ext/icu.
Auch mit Python braucht es extra Pakete, z.B. PyICU.
snowflake
User
Beiträge: 93
Registriert: Mittwoch 9. November 2016, 15:46

Ich habe versucht Eure Lösungsvorschläge nachzuvollziehen. Ich stehe wie eine Ochse vor dem Berg und weiß nicht weiter.

Das hier hat bei mir nicht funktioniert:

Code: Alles auswählen

def stricmp(str1, str2):
    str1 = str1.lower()
    str2 = str2.lower()
    if str1 == str2:
        return 0
    elif str1 < str2:
        return -1
    else:
        return 1

connection  = sqlite3.connect("test.db")
connection.create_collation('NOCASE', stricmp)
Die Funktion wird gar nicht aufgerufen.

@Sirius3: Was ist das für eine Extention? Wie kann ich die einbinden?

Vielen Dank

snowflake
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Das steht doch in dem README, das ich verlinkt habe, achso, der Link ist kaputt gegangen: https://www.sqlite.org/src/dir?name=ext/icu
Und ohne eine Zusatzbibliothek funktioniert die Sortierung nicht, also wie in der Zweiten Antwort auf Stackoverlow, pyuca (Bei den Antworten auf der Seite muß man immer sehr vorsichtig sein, dass sie auch wirklich das Problem lösen, das man selbst hat).
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Also fuer mich funktioniert das, und das ohne zusaetzliche Module:

Code: Alles auswählen

import sqlite3

def collate_crazy(left, right):
    if left == "deets":
        return -1
    if right == "deets":
        return 1

    return cmp(left, right)

con = sqlite3.connect(":memory:")
con.create_collation("crazy", collate_crazy)
cur = con.cursor()
cur.execute("create table test ( foo varchar )")
cur.execute("insert into test values ('deets')")
cur.execute("insert into test values ('adam')")
cur.execute("select foo from test order by foo collate crazy")
for row in cur:
    print(row)
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@__deets__: zusaetzliche Module braucht man ja auch nur, wenn man wirklich lexikalisch richtig sortieren will.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

So wie das klang hat snowflake seine eigene Version von richtig ;) So wie deets natuerlich immer nach vorne sortiert gehoert!
bb1898
User
Beiträge: 199
Registriert: Mittwoch 12. Juli 2006, 14:28

__deets__ hat geschrieben: Mittwoch 14. November 2018, 11:56 So wie das klang hat snowflake seine eigene Version von richtig ;) So wie deets natuerlich immer nach vorne sortiert gehoert!
Glaube ich nicht. Sein Beispiel ist bloß unvollständig. Richtig ist doch

Krabbe
Krämer
Krames

Einverstanden, snowflake?
Antworten