SQLite: Unterschied Operatoren LIKE und = mit Parametern

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Socke
Lazarusforum e. V.
Beiträge: 3177
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

SQLite: Unterschied Operatoren LIKE und = mit Parametern

Beitrag von Socke »

Hallo Leute,

Gegeben sei eine SQLite-Datenbank mit einer Tabelle:

Code: Alles auswählen

CREATE TABLE config_global (
  cname STRING NOT NULL PRIMARY KEY,
  cvalue NOT NULL
);
Diese ist mit einem Datensatz gefüllt, der durch eine Abfrage ausgewählt werden soll:

Code: Alles auswählen

cname  | cvalue
-------+-------
DBINIT | 1
Bei den Abfragen habe ich 3 Varianten getestet; Bei Variante 2 und 3 wird der Text durch sqlite_bind_text() eingefügt.

Code: Alles auswählen

SELECT * FROM config_global WHERE cname = 'DBINIT'; -- Variante 1
SELECT * FROM config_global WHERE cname = ?1;       -- Variante 2
SELECT * FROM config_global WHERE cname LIKE ?1;    -- Variante 3
Meine Frage ist jetzt: Warum liefern Variante 1 und 2 das gleiche Ergebnis (der Datensatz ist enthalten), während Variante 2 eine leere Ergebnismenge zurück gibt?
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

hde
Beiträge: 556
Registriert: Mi 11. Aug 2010, 02:56

Re: SQLite: Unterschied Operatoren LIKE und = mit Parametern

Beitrag von hde »

Die Datenbanken funktionieren mit LIKE unterschiedlich.
Einige Datenbanken erwarten bei LIKE unbedingt einen Joker, (string etc)
anderen ist das egal und dort ist dann = und LIKE dasselbe
hde

Socke
Lazarusforum e. V.
Beiträge: 3177
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: SQLite: Unterschied Operatoren LIKE und = mit Parametern

Beitrag von Socke »

hde hat geschrieben:Einige Datenbanken erwarten bei LIKE unbedingt einen Joker, (string etc)
anderen ist das egal und dort ist dann = und LIKE dasselbe
Bei SQLite ist definitiv letztes der Fall; sofern kein Joker vorhanden ist, verhält sich beides identisch.
Da der Fehler nur mit meinem eigenen OOP-Wrapper auftrat, habe ich herausgefunden, dass ich den Längenparameter beim Ersetzen des Parameters falsch berechnet hatte. Da hatte ich doch glatt Pascal-String-Index mit Char-Array-Index verwechselt.

Code: Alles auswählen

var
  FHandle: psqlite3_stmt;
  aStr: String;
begin
sqlite3_bind_text(FHandle, Index, PChar(aStr), Length(aStr) // hier stand 'Length(aStr) + 1' was falsch ist
    , sqlite3_destructor_type(SQLITE_TRANSIENT))
end;
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Antworten