Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi FireDAC SQLite Typ VARCHAR(2) vs. STRING(2) (https://www.delphipraxis.net/201269-delphi-firedac-sqlite-typ-varchar-2-vs-string-2-a.html)

Blo 6. Jul 2019 11:00

Datenbank: SQLite • Version: 3.x • Zugriff über: FireDAC

Delphi FireDAC SQLite Typ VARCHAR(2) vs. STRING(2)
 
Wir betreiben eine Datenbank-Anwendung (Delphi 10.3 Rio, Vcl, FireDAC, SQLite)

Folgendes ist uns aufgefallen (und nicht verstehen):

Die SQLite-Datenbank hat u.a. ein Feld mit dem Typ STRING(2). Wenn wir da z.B. „07“ abspeichern, die Tabelle wieder öffnen und das Feld auslesen (FieldByName().AsString) wird „7“ zurückgeliefert. In der Tabelle ist auch wirklich nur eine „7“ gespeichert (mit SQLManager nachgeprüft).

Wenn wir den Typ auf VARCHAR(2) für dieses Feld ändern, wird „07“ zurückgeliefert.

„07“ ist der richtige Wert, wird auch im weiteren Programmverlauf nicht in ein Zahlformat umgewandelt.

roga 6. Jul 2019 13:56

AW: Delphi FireDAC SQLite Typ VARCHAR(2) vs. STRING(2)
 
Wie wird der String gespeichert? Der String sollte auch in Anführungszeichen gesetzt werden: "07"

Blo 6. Jul 2019 14:23

AW: Delphi FireDAC SQLite Typ VARCHAR(2) vs. STRING(2)
 
Durch Kopieren aus einer anderen Datenquelle:

Delphi-Quellcode:
qryZiel.FieldByName('ASD').asString:= qryQuelle.FieldByName('ASD').asString;

jobo 6. Jul 2019 14:55

AW: Delphi FireDAC SQLite Typ VARCHAR(2) vs. STRING(2)
 
sqlite hat ein etwas ungewöhnliches Verhalten, was die Spaltentypen und ihre Zuordnung / Werteinterpretation angeht. Im Grunde ist jedes DB System (oder auch Anwendung) der Problematik unterworfen, den Typ eines zu verarbeitenden Wertes zu bestimmen, jedenfalls in dem Moment, wo es nicht explizit im Code gehandhabt wird oder direkt ableitbar ist.
sqlite nennt das Type Affinity. Kannst du ja mal nachschlagen und schauen, ob sich Dein Problem damit erklären lässt.

Blo 6. Jul 2019 15:57

AW: Delphi FireDAC SQLite Typ VARCHAR(2) vs. STRING(2)
 
Erklärungsversuch:
In dem ich schreibe "VARCHAR(2)" (Hier ist die Zeichenfolge "CHAR" enthalten) wird (die sogenannte) Säulenaffinität "TEXT" zugeordnet. Andernfalls ist die Affinität "NUMERIC". "STRING" benhaltet nicht die Zeichenfolge "CHAR" also auch "NUMERIC" als Säulenaffinität.

Also macht der Feldtyp "STRING" aus "07" eine "7".


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:47 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz