SQL Lite 3,String mit mehr als 255 Zeichen,speichern[gelöst]

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1645
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

SQL Lite 3,String mit mehr als 255 Zeichen,speichern[gelöst]

Beitrag von corpsman »

Guten morgen allerseits,

Ich bastle so an einer DB in SQL Lit 3 rum und nutze dabei folgende Tabelle :

Code: Alles auswählen

// Tabelle Enums
  DB.SQL.Text :=
    'create table enums('#13#10 +
    'Typ varchar not null,'#13#10 +
    'Sprache varchar not null,'#13#10 +
    'Data varchar,'#13#10 +
    'Min_Value integer ,'#13#10 +
    'Max_Value integer ,'#13#10 +
    'Schrittweite integer ,'#13#10 +
    'Einheit varchar,'#13#10 +
    'Valid_Values varchar,'#13#10 +
    'PRIMARY KEY (Typ, Sprache)'#13#10 +
    ');';
In meine Spalte "Data" will ich nun einen String Speichern der auch Länger sein kann als 255 Zeichen ( Fast immer ist er Kürzer ) aber ab und an eben auch länger.
Wie mache ich das ? In der Aktuellen Version wird der String einfach nach 255 Zeichen abgeschnitten. Wenn ich den String beim auslesen nicht überwacht hätte dann hät mir die SQL DB das nicht mal als Fehler gesagt..

Ich hab auch schon gelesen das das wohl mit einem "Blob" geht, aber ich hab natürlich keine Ahnung was das ist.

Nu Denn, könnt ihr mir weiter helfen ?

Gruß

Corpsman
Zuletzt geändert von corpsman am Mi 11. Jul 2012, 07:32, insgesamt 1-mal geändert.
--
Just try it

Socke
Lazarusforum e. V.
Beiträge: 3178
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: SQL Lite 3, String mit mehr als 255 Zeichen, speichern..

Beitrag von Socke »

corpsman hat geschrieben:Ich bastle so an einer DB in SQL Lit 3 rum und nutze dabei folgende Tabelle :

Code: Alles auswählen

// Tabelle Enums
  DB.SQL.Text :=
    'create table enums('#13#10 +
    'Typ varchar not null,'#13#10 +
    'Sprache varchar not null,'#13#10 +
    'Data varchar,'#13#10 +
    'Min_Value integer ,'#13#10 +
    'Max_Value integer ,'#13#10 +
    'Schrittweite integer ,'#13#10 +
    'Einheit varchar,'#13#10 +
    'Valid_Values varchar,'#13#10 +
    'PRIMARY KEY (Typ, Sprache)'#13#10 +
    ');';
SQLite3 kennt nur 5 Datentypen:
  • Text
  • Integer (64 Bit)
  • Float/Real (Double, 8 Byte)
  • BLOB
  • Null
Der Datenbank ist es egal, wie lang deine Zeichenkette ist. SQLite nimmt auch fröhlich eine Zahl entgegen und speichert Sie in einer "Text"-Spalte. Die Begrenzung auf 255 Zeichen findet also definitiv nicht in der Datenbank sondern in deinen Datenbank-Komponenten statt. Daher wäre es sehr gut, wenn du sagen könntest, welche das ist.

Als ersten Ansatz kannst du versuchen den Datentyp für deine Datenbank-Komponenten zu ändern: probiere Alternativen zu varchar wie text, memo. Möglicherweise musst du das auch nicht in der Tabellen-Defintion sondern in irgendwelchen Feldern ändern.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1645
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: SQL Lite 3, String mit mehr als 255 Zeichen, speichern..

Beitrag von corpsman »

Ich verwende :

SQLite3Connection1: TSQLite3Connection;
SQLQuery1: TSQLQuery;
SQLTransaction1: TSQLTransaction;
Unter Windows XP und meine Strings sind UTF8. Hier steht, dass ich das als Nicht UTF8 übergeben soll, dann würde es gehen.

Da ich nun aber zu Hause bin und da nur ein Ordentliches Betriebsystem habe, muss ich bis morgen im Gschäft warten, bis ich es testen kann.

Übrigens ist meine Datenbank so wie in diesem Sample.
--
Just try it

EgonHugeist
Beiträge: 93
Registriert: Di 17. Apr 2012, 22:41

Re: SQL Lite 3, String mit mehr als 255 Zeichen, speichern..

Beitrag von EgonHugeist »

@corpsman,

Socke hat vollkommen recht. SQLite ist ein echter Allesfresser! Es wird noch nichtmal auf valide byte-Sequenzen der verlangten utf8 strings geachtet.

Dein 255 Zeichen Problem läßt sich leicht erklären. In deiner varchar Declareration befindet sich keine maximale Länge wie varchar(1000) oder so. Daher ist jede db-componente irgendwie unfreiwilliger Weise gezwungen einen standart Wert herzunehmen. Wir bei Zeos ebenfalls. Früher waren nun mal varchar fields auf 255 Zeichen begrenzt. Somit wurde dieses mit übernommen. Du solltest einfach sauberer definieren, was du tatsächlich verlangst. Würdest du zum Beispiel ein Feld PLZ varchar definieren, würde ebenfalls der Standart von 255 Zeichen genutzt, brauchen würdest du jedoch nur 5. Genauso sieht es dann mit den Speicher-Reservierungen aus.

Also versuch dich an die SQL Standarts zu halten und allet is jut!

Michael
ZeosDevTeam

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1645
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: SQL Lite 3, String mit mehr als 255 Zeichen, speichern..

Beitrag von corpsman »

Ich ging davon aus, dass varchar bedeutet, dass die DB die Länge des Strings variabel macht. In Lazarus gibt es die 255 Zeichen Beschränkung auch nicht und ich kann dort ebenfalls Strings fester länge Definieren.

Übrigens nutze ich eigentlich keine DB Komponenten außer den oben gezeigten.

Ich nutze zum Außlesen einen Code wie z.B. diesen :

Code: Alles auswählen

Function GetTranslatedEnumData(Sprache: String; DB: TSQLQuery): TEnumDaten;
Var
  b: Boolean;
  f: TField;
  s: String;
Begin
  Query(..);
  b := false;
  While Not db.EOF Do Begin
    b := true;
    f := db.FieldByName('Data');
    result.data := f.AsString;
..
    db.next;
  End;
End;
--
Just try it

EgonHugeist
Beiträge: 93
Registriert: Di 17. Apr 2012, 22:41

Re: SQL Lite 3, String mit mehr als 255 Zeichen, speichern..

Beitrag von EgonHugeist »

Unwissenheit ist menschlich. Dafür sind ja die Foren da.

Varchar heißt vielmehr variable Anzahl von Bytes pro Char/Buchstabe. Das kommt ganz einfach auf die CodePage des AnsiString an. Kann je nach CodePage zwischen 1(USASCII) und 6(BIG5 oder EUC/GB/SJS codiert) zum Bsp.

Michael
ZeosDevTeam

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1645
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: SQL Lite 3, String mit mehr als 255 Zeichen, speichern..

Beitrag von corpsman »

Das Heist ich komm nicht drumrum die Anzahl zu definieren, ..

Meine DB hat nun schon ein paar hundert einträge, gibts ne bessere Möglichkeit wie alles löschen und neu erstellen um aus der 255 etwas größeres zu machen ?

[Edit]
Habe mich nun für die Saubere Definition entschieden, meine DB überprüft beim neu hinzufügen eines Eintrages nun die Breite, und erstellt ggf. die Tabelle neu. Danke für die erklärungen zu Varchar werde das in Zukunft richtig nutzen.
--
Just try it

EgonHugeist
Beiträge: 93
Registriert: Di 17. Apr 2012, 22:41

Re: SQL Lite 3,String mit mehr als 255 Zeichen,speichern[gelöst]

Beitrag von EgonHugeist »

Gerne geschehen.
Deinen Export hast du scheinbar auch schon gelöst...

Du wirst nicht der einzige sein, der da in die Falle getappt ist. (;

Michael
ZeosDevTeam

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10: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

Re: SQL Lite 3, String mit mehr als 255 Zeichen, speichern..

Beitrag von mse »

EgonHugeist hat geschrieben: Varchar heißt vielmehr variable Anzahl von Bytes pro Char/Buchstabe. Das kommt ganz einfach auf die CodePage des AnsiString an. Kann je nach CodePage zwischen 1(USASCII) und 6(BIG5 oder EUC/GB/SJS codiert) zum Bsp.
Zur Klarstellung:
varchar(n) bedeutet in SQL eine Zeichenkette mit maximal n Zeichen. Unter "Zeichen" wird in der Regel ein "Code Point" verstanden. Alte Firebird Versionen mit der Zeichencodierung UNICODE_FSS zählen Bytes, die Firebird UTF_8 Zeichencodierung zählt codepoints.
Im Gegensatz zu SQL varchar(n) (ftString) bezeichnet char(n) (ftFixedChar) eine Zeichenkette fester Länge. Nicht definierte Stellen am Schluss werden dabei mit Leerzeichen gefüllt.
SQLite3 bildet varchar(n) und char(n) auf den SQLite3 internen Datentyp TEXT ab, welcher keine Längenbeschränkung hat.
http://www.sqlite.org/datatype3.html, dies ist eine SQLite3 Spezialität.
Innerhalb der FPC Zugriffskomponenten kann aber trotzdem eine Längenbeschränkung stattfinden. Ob dabei codepoints oder Bytes gezählt werden ist Implementationsabhängig. MSEgui zählt codepoints, Lazarus zählte früher Bytes, ich weiss nicht ob das mittlerweile geändert wurde.

Martin

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1645
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: SQL Lite 3,String mit mehr als 255 Zeichen,speichern[gelöst]

Beitrag von corpsman »

Also wenn ich dich richtig verstehe, dann hätte es genügt wenn ich meine Tabelle mittels :

Code: Alles auswählen

// Tabelle Enums
  DB.SQL.Text :=
    'create table enums('#13#10 +
    'Typ text not null,'#13#10 +
    'Sprache text not null,'#13#10 +
    'Data text,'#13#10 +
    'Min_Value integer ,'#13#10 +
    'Max_Value integer ,'#13#10 +
    'Schrittweite integer ,'#13#10 +
    'Einheit text,'#13#10 +
    'Valid_Values text,'#13#10 +
    'PRIMARY KEY (Typ, Sprache)'#13#10 +
    ');';
Definiert hätte ?

Zumindest scheint mein "Schnell test" von Hand in meiner SQL Demo Applikation das so richtig um zu setzen.
--
Just try it

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10: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

Re: SQL Lite 3,String mit mehr als 255 Zeichen,speichern[gelöst]

Beitrag von mse »

Mit den Typdefinitionen "TEXT" musst du vorsichtig sein. Lazarus interpretiert sie vermutlich als ftMemo. MSEgui speichert in tmsebufdataset Textfelder grundsätzlich als UnicodeString unbegrenzter Länge und kann dadurch auch ftMemo-Felder wie normale ftString- oder ftFixedChar-Felder behandeln. Dazu gibt es den Schalter tmseslquery.controller.options dso_stringmemo. Lazarus hat diese Option so viel ich weiss nicht.

Martin

Socke
Lazarusforum e. V.
Beiträge: 3178
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: SQL Lite 3,String mit mehr als 255 Zeichen,speichern[gelöst]

Beitrag von Socke »

mse hat geschrieben:Mit den Typdefinitionen "TEXT" musst du vorsichtig sein. Lazarus interpretiert sie vermutlich als ftMemo.
Soweit ich weiß, stimmt das. Gibt es eigentlich irgendwo eine schöne Dokumentation über diese verschiedenen "Typen"? Ich konnte bisher noch nicht schlau daraus werden, für Zeichenketten fünf verschiedene Typen anzugeben.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Antworten