Entwickler-Ecke
Datenbanken - Variable String-Längen speichern?
gispos - Di 20.11.07 05:55
Titel: Variable String-Längen speichern?
Hallo zusammen,
da ich bisher nur mit selbst programmierten Datenbanken gearbeitet habe, hätte ich da eine simple Frage zu „normalen“ Datenbanken.
Ist es möglich Strings in variabler Länge, also z.B. mit 24 Zeichen und den nächsten String dann mit 62 Zeichen abzuspeichern?
Bei einer Accuracer hatte ich bisher noch keinen Erfolg. Da werden die Strings, auch wenn ich aftString (VarChar) verwende, immer in der im Table angegebenen Länge z.B. 255 gespeichert, was dann natürlich bei 50000 Records gleich zu einer sehr großen Datenbank-Datei führt.
Was mache ich hier falsch? Oder ist dies nur über Blob-Fields möglich?
Gruß gispos
mexx - Di 20.11.07 08:23
Wir verwenden eine Firebird-Datenbank. Dort werden Stringfelder vom Typ VarChar auch nur mit der Länge des Strings abgespeichert. Also wenn der Feldtyp VarChar(25) ist, so ist die maximale Länge des Strings 25 Zeichen. Kleinere Strings werden jedoch auch nur in der Länge des Strings abgespeichert. Eine Char(25) Formatierung hat zur Folge, dass die restlichen Zeichen mit Leerzeichen ausgefüllt werden.
mkinzler - Di 20.11.07 08:56
Varchar-Felder sollte eigentlich in jedem DBMS mit variabler Länge gespeichert werden. Welches DBMS setzt du ein?
mexx - Di 20.11.07 09:00
Oder wie füllst Du die Felder? Vielleicht hat Dein Verfahren zur Folge, dass die restlichen Zeichen nicht mit einen null-String übertragen werden, sondern mit Leerzeichen.
gispos - Di 20.11.07 16:52
Also das Table (Fields) erstelle ich so:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| with advFieldDefs do begin Clear; Add('ID',aftAutoInc,0); Add('FileName',aftString,255); Add('FileSize',aftLargeint); end; |
Zuweisung dann so:
Delphi-Quelltext
1: 2: 3: 4: 5:
| ACRTable1.Append; ACRTable1.FieldByName('FileName').AsString:= TreeScanner1.FileFound; ACRTable1.FieldByName('FileSize').AsInteger:= TreeScanner1.FileSize; ACRTable1.Post; |
Wenn ich mir die Datenbankdatei anschaue wird für jeden String 255 Byte reserviert.
Nun ist ja meine Frage, ob es möglich ist, nur die wirklich benötigte Länge des String
in die Datenbank zu schreiben. Also nicht immer gleich 255 Zeichen in der Datei zu
reservieren.
Nachtrag:
@mkinzler > eine Accuracer von AidAim
Noch etwas, 8892 Records führen zu einer Dateigröße von 6489 KB, macht pro Record
ca. 750 Byte, ist das normal? Bei meiner Datenbank speichere ich 100000 Records mit
je 10 Variablen bei einer Dateigröße von ca. 7000 KB.
Gruß gispos
Sinspin - Di 20.11.07 18:51
Ich kenne für solche Zwecke bei der DB von Advantage den Typ Memo. Da können die Strings maximal 4GB lang sein! Die Tabelle selber wird nur mit 9 Byte belastet. Zudem existiert dann eine Datei in der die ganzen Strings hintereinander drinne stehen.
gispos - Di 20.11.07 19:25
Sinspin hat folgendes geschrieben: |
| Ich kenne für solche Zwecke bei der DB von Advantage den Typ Memo. Da können die Strings maximal 4GB lang sein! Die Tabelle selber wird nur mit 9 Byte belastet. Zudem existiert dann eine Datei in der die ganzen Strings hintereinander drinne stehen. |
Nach einem Memo-Feld lässt es sich aber schlecht suchen. Möchte den Record durch den
String wieder finden (Fast and Faster). Und wenn ich's richtig verstanden habe, wird dann für jeden String eine extra Datei angelegt, oder? Und dass dann für 100000 Strings! :wink:
Nachtrag:
Habs doch erst falsch verstanden, Du meinst eine Datei für alle Memo-Felder, richtig?
Bleibt aber noch das Problem mit dem schnellen finden.
Gruß gispos
mkinzler - Di 20.11.07 19:31
Erzeuge die Tabelle doch mal per SQL und das Feld dann als VarChar
Sinspin - Di 20.11.07 19:44
Das der String nicht in der Tabelle liegt, sondern in einer extra Datei, merkst du nicht. Du fragst ganz normal einfach das Feld ab. Und dank indizierter Full Text Suche (FTS) ist das Suchen auch noch extrem schnell. (das gibt es aber, soweit ich weis nur bei Advantage)
gispos - Di 20.11.07 19:59
@mkinzler >
Oh, jetzt wird’s interessant! Bin keiner der zu faul zum suchen ist, aber…
vielleicht kannst Du mir mal so nebenbei erklären, wie eine Table per SQL erstellt wird?
In der Hilfe zur Accuracer kann ich da außer „ExportTableToSQL“ nichts finden.
Oder meinst Du eine SQL-Datenbank? Was ich immer noch nicht verstehe ist, das die
Accuracer ja VarChar unterstützt, aber dennoch immer die vollen 255 Zeichen speichert.
Schon mal Danke.
@Sinspin > Ok, werde mir mal eine von Advantage er-googeln und mir genauer anschauen.
Hatte damals mal einen Speed Test zwischen: Borland DB, Absolute Database u. Accuracer
gemacht, und Accuracer war 10-20 mal schneller als Absolute-DataBase.
Danke und Gruß
gispos
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!