SQLITE - Rückgabewert von SELECT

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.

SQLITE - Rückgabewert von SELECT

Beitragvon RuhrPotto » 6. Mai 2015, 12:04 SQLITE - Rückgabewert von SELECT

Hallo zusammen,

ich hab wohl grad ein echtes Brett vorm Kopf. Die Tabelle in einer DB wurde wie folgt angelegt:
Code: Alles auswählen
CREATE TABLE IF NOT EXISTS tblKategorie (KATHID INTEGER, KATUID INTEGER, KATART INTEGER, KATBEZ VARCHAR(10), KATINFO VARCHAR(10), KATEST BOOLEAN)


Die Tabelle ist mit Testdaten gefüllt und wird
Code: Alles auswählen
SELECT * FROM tblKategorie

gelesen.
Die Rückgabemenge entspricht auch dem Ergebnis. Aber
:?: Textfelder werden nur mit einer Länge von 10 Zeichen zurückgeliefert. Sind aber in der DB in richtiger Länge gespeichert.
Es macht auch keinen Unterschied, wie die Felder übertragen werden:
Code: Alles auswählen
sKat.KBez   := SqlQuery1.FieldByName('KATBEZ').AsString;
sKat.KInfo  := SqlQuery1.Fields[4].AsString;

in beiden Fällen werden Texte auf 10 Zeichen gekürzt.

Hat hierfür jemand eine Erklärung und Lösung?

Danke schonmal
Jeder macht Fehler - viele Fehler brauchen EDV!
RuhrPotto
 
Beiträge: 39
Registriert: 6. Mai 2015, 11:52

Beitragvon mse » 6. Mai 2015, 12:10 Re: SQLITE - Rückgabewert von SELECT

"VARCHAR(10)" macht die Begrenzung. Da Sqlite3 intern keine Begrenzung anwendet, siehst du mit verschiedenen tools auch längere Texte.
mse
 
Beiträge: 2013
Registriert: 16. Okt 2008, 09:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0) | 
CPU-Target: x86,x64,ARM
Nach oben

Beitragvon RuhrPotto » 6. Mai 2015, 12:17 Re: SQLITE - Rückgabewert von SELECT

mse hat geschrieben:"VARCHAR(10)" macht die Begrenzung. Da Sqlite3 intern keine Begrenzung anwendet, siehst du mit verschiedenen tools auch längere Texte.


Hatte ich mir bis dahin fast gedacht. Aber wie komme ich dann an den gesamten Text des Feldes?
Jeder macht Fehler - viele Fehler brauchen EDV!
RuhrPotto
 
Beiträge: 39
Registriert: 6. Mai 2015, 11:52

Beitragvon mse » 6. Mai 2015, 13:26 Re: SQLITE - Rückgabewert von SELECT

In MSEgui kann man eine Query z.B. so schreiben:
Code: Alles auswählen
 
select ID,cast(STR1 as VARCHAR) as STR1 from table1
 

um die Begrenzung zu entfernen. Ich weiss nicht, ob das auch in Lazarus funktioniert.
mse
 
Beiträge: 2013
Registriert: 16. Okt 2008, 09:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0) | 
CPU-Target: x86,x64,ARM
Nach oben

Beitragvon hde » 6. Mai 2015, 14:47 Re: SQLITE - Rückgabewert von SELECT

warum creierst du denn VARCHAR(10) wenn du längere Texte willst?
Und womit greifst du zu? Zeos oder Lazarus?
hde
 
Beiträge: 556
Registriert: 11. Aug 2010, 01:56

Beitragvon RuhrPotto » 6. Mai 2015, 15:33 Re: SQLITE - Rückgabewert von SELECT

Der Zugriff erfolgt über Lazarus.

Die Verwendung von VARCHAR(10) erfolgt aus Speicherplatzgründen. Aus anderes DB kenne ich es so, dass hierdurch nur der minimale angebene Platz für die Variable reserviert wird und dieser bei längeren Strings auf die tatsächliche bzw. maximal Länge extended wird. Das DB2 liefert zum Beispiel bei SELECT trotzdem die echte Länge des Strings zurück.
SQLITE scheint anderes zu arbeiten obwohl es die tatsachliche Länge und den Inhalt des Strings korrekt speichert.

Ich habe testweise den CREATE wie folgt
Code: Alles auswählen
KATBEZ VARCHAR, KATINFO VARCHAR
geändert.
Nunmehr liefert der SELECT die Strings in korrekter Länge zurück.

Ich habe die Felder in der Tabelle auch nicht als TEXT definiert, da diese Felder meines Wissens nicht indizierbar sind und später ein Sek-Index angelegt werden soll
Jeder macht Fehler - viele Fehler brauchen EDV!
RuhrPotto
 
Beiträge: 39
Registriert: 6. Mai 2015, 11:52

Beitragvon hde » 6. Mai 2015, 18:20 Re: SQLITE - Rückgabewert von SELECT

RuhrPotto hat geschrieben:Die Verwendung von VARCHAR(10) erfolgt aus Speicherplatzgründen.

Sind deine rechner sooooo klein? :wink:
du kannst doch SQLite nicht mit DB2 vergleichen, das sind verschiedene Welten
hde
 
Beiträge: 556
Registriert: 11. Aug 2010, 01:56

Beitragvon af0815 » 6. Mai 2015, 18:36 Re: SQLITE - Rückgabewert von SELECT

RuhrPotto hat geschrieben:in beiden Fällen werden Texte auf 10 Zeichen gekürzt.

Hat hierfür jemand eine Erklärung und Lösung?

Aus meiner Sicht, hat das System recht !

Wenn ich ein Datenbankdesign mache, dann muss ich mir vorher überlegen wie das Design der Tabellen wird (auch über die Lebensdauer des Systems gesehen). Sich da auf ein paar zufällige Spezialitäten von System zu verlassen ist grob fahrlässig.

Lösung, das Design richtigstellen. Eventuell eine Kurzbeschreibung mit beschränkter Länge und eine Langform, die eventuell auch als Text gespeichert werden kann, diese kann je nach System mit einem Volltextindex auch durchsucht werden. Siehe perform full-text searches on a set of documents wenn es sqlite sein soll.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
af0815
 
Beiträge: 3605
Registriert: 7. Jan 2007, 10:20
Wohnort: Niederösterreich
OS, Lazarus, FPC: FPC 3.2 Lazarus 2.0 per fpcupdeluxe | 
CPU-Target: 32Bit (64Bit)
Nach oben

Beitragvon RuhrPotto » 7. Mai 2015, 11:03 Re: SQLITE - Rückgabewert von SELECT

1. Ich wollte ein DBMS vom Typ DB2 nicht mit SQLite vergleichen
2. Meine Rechner/HD's sind nicht klein

Aber ich mache mir Gedanken um das Design und Speicherplatz. Auch schon berufsbedingt aufgrund der Programmentwicklung auf Großrechnern.
Und - wenn ich zB. die Zahlenwerte [1..5] speichern will, dann nehme ich den Typ BYTE und nicht INTEGER oder CARDINAL.

Im Rahmen einer Portierung sollen typisierte Dateien in eine DB überführt werden. Auch hier definierte man doch nicht jedes Textfeld als STRING[255].

Es geht/ging mir nur darum, warum die Inhalte zwar korrekt eingegeben/übernommen werden aber im Rahmen des SELECT nicht vollständig zurückgeliefert werden.
Mir ist dabei auch klar, dass ich mich mit SQLITE noch nicht besonders gut auskenne und ich nicht alle Features von DB2 übertragen und verwenden kann.
Jeder macht Fehler - viele Fehler brauchen EDV!
RuhrPotto
 
Beiträge: 39
Registriert: 6. Mai 2015, 11:52

Beitragvon af0815 » 7. Mai 2015, 11:44 Re: SQLITE - Rückgabewert von SELECT

Vielleicht ist die Full Text Search doch was für dich. Gerade wenn du typisierte Dateien überführst und den Platz optimieren willst. Die Frage ist hier, was der Inhalt der Dateien ist und ob man es mit FTS optimieren kann.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
af0815
 
Beiträge: 3605
Registriert: 7. Jan 2007, 10:20
Wohnort: Niederösterreich
OS, Lazarus, FPC: FPC 3.2 Lazarus 2.0 per fpcupdeluxe | 
CPU-Target: 32Bit (64Bit)
Nach oben

• Themenende •

Zurück zu Datenbanken



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste

porpoises-institution
accuracy-worried