SQLite3: Merkwürdiges Verhalten 'PRAGMA case_sensitive_like = boolean;'

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
laserflor
Beiträge: 8
Registriert: Fr 8. Dez 2017, 20:47

SQLite3: Merkwürdiges Verhalten 'PRAGMA case_sensitive_like = boolean;'

Beitrag von laserflor »

Hallo an alle!
Seit einiger Zeit fällt mir ein merkwürdiges Verhalten bei Benutzung von PRAGMA case_sensitive_like = boolean; auf

Code: Alles auswählen

SQLite3Connection1.ExecuteDirect('PRAGMA case_sensitive_like = ' +
  strcase[CaseSensitive.Checked] + ' ;');
Diesen Aufruf benutze ich vor der Hauptabfrage für meine Datenbanktabelle.
Seltsamerweise wirkt 'PRAGMA case_sensitive_like = 1 ;' nur, nachdem ich eine Abfrage mit mehr als zwei %-Zeichen gestartet habe.

Meine Application soll beim Auffinden von Dateien helfen, da die Explorer-Suchfunktion weder effektiv noch flexibel ist.
Die Datenbank enhält also Dateinamen, die auf der Festplatte gesucht werden, wobei ich beim Anlegen der Tabellenzeilen von vornherein bestimmte Dateien und Ordner ausschließe, die für mich nicht relevant sind. Natürlich spielt Groß-/Kleinschreibung bei Windows keine Rolle, bei Linux schon. Ich möchte aber dennoch in bestimmten Situationen groß/klein unterscheiden.

Vielleich kennen ja einige hier den Editor SciTE, der hier als Beispiel fungiert.
Gebe ich nun "%SciTE%" für den LIKE-Filter ein, hat das PRAGMA keinen Einfluss. Genauer gesagt, das Umschalten funktioniert nicht.
Um genaue Zahlen zu nennen:
1. Abfrage:
... LIKE "%SciTE%" ... -> 524 Datensätze (PRAGMA case_sensitive_like = 0 ; )
... LIKE "%SciTE%" ... -> sollte 380 Datensätze ergeben bei (PRAGMA case_sensitive_like = 1 ; ) ergibt aber trotzdem 524 Datensätze.
380 Datensätze werden gezeigt, nachdem ich einmal die 2. Abfrage gestartet habe. Bei jeder weiteren Abfrage werden immer 524 Datensätze gezeigt, wobei es nur dann nicht case_sensitive ist, wenn ich zwischendurch 'PRAGMA case_sensitive_like = 0 ;' aufrufe.
2. Abfrage:
... LIKE "%SciTE%lpeg%" -> 11 Datensätze (PRAGMA case_sensitive_like = 0 ; )
... LIKE "%SciTE%lpeg%" -> 4 Datensätze (PRAGMA case_sensitive_like = 1 ; ) funktioniert auch nur nachdem die Abfrage einmal gestartet wurde.

Probiere ich das gleiche auf der Kommandozeile mit sqlite3.exe, funktioniert es jedesmal tadellos.

Ich hoffe, dass es einleuchtend ist, was ich hier beschreibe.
Ich habe das gleiche auch mit Linux ausprobiert und dort hat das gesetze case_sensitive_like immer den richtigen Effekt.
Ich tippe auf einen Fehler in der sqlite3.dll und habe deshalb schon die neueste Version (3.38.5) benutzt.

Grüße laserflor

Edit 1:
Ich habe nochmal einige Versuche für die LIKE-Parameter gemacht und es scheint am Inhalt zwischen den %% zu liegen.

Antworten