SQL MS SQL Binary Frage

roker002

Commander
Registriert
Dez. 2007
Beiträge
2.107
Ich habe eine Frage bezüglich der Abspeichung der Bilder auf der DB. Ich möchte eine Tabelle haben wo man auch Bilder in Größe von 32x32 Pixel abspeichern kann.

Hierfür kann man in MS SQL Binary oder Varbinary benutzen. Und hier ist die eigentliche Frage!

Was sollte man besser benutzen? Varbinary oder Binary und wie viel Zeichen sollte man reservieren?

Thx voraus!
 
Kann man irgendwie einen ungefähren Wert errechnen wie viel Zeichen eine Auflösung des Bildes hat?
 
das kommt darauf an ob das bild komprimiert ist und welche Farbtiefe es hat.

Nehmen wir ein 32x32 Bild mit 32 Bit Farbtiefe (das würde #AAFFEE00 entsprechen -> 256 werte pro grundfarbe incl. Alphakanal)
das ergibt dann 32x32x32 Bit Daten -> 32 Kbit -> 4 KB wenn es unkomprimiert gespeichert wird.

Sobalds allerdings komprimiert gespeichert wird z.B als JPG, PNG oder ähnliches dann kanns weniger werden, sollte allerdings soweit ich weiß nicht mehr als diese 4KB werden

wenn du andere Farbtiefen hast, der Informationsgehalt ist einfach breite * höhe * Farbtiefe und zwar in Bit. Das ganze dann / 8 damit du auf Byte kommst und / 1024 um auf Kilobyte zu kommen...
(sry falls du das eh wusstest, aber es is immer gut wenn man auch die Basics erklärt)
 
Zuletzt bearbeitet:
Danke... dann sollte man min Länge von 4000 Zeichen nehmen?
 
Ich versteh deine Frage einfach nicht. Varbinary passt die größe dynamisch an deinen Platzbedarf an.

Wenn du also einfach varbinary (8000) nimmst, dann kannst du bis ca. 8kb Länge alles drinn speichern.

Wenn du weniger brauchst, weil deine Datei nur 3.2kb z.B. ist, dann brauchst du auch nicht wesentlich mehr, als diese 3.2kb.

Binary würde sich daher meiner Meinung nach nur anbieten, wenn du die 32x32 Pixel immer im selben Roh-Format in deine Datenbank speicherst.
 
Hmm vielleicht habe ich falsch verstanden, was die Länge des Datentypes angeht.

Also wäre es eigentlich für den Platzbedarf (auf der Festplatte) ob es hier varbinary(MAX) oder varbinary(x) stehen würde? Oder gibt es hier unterschiede?

Da ich MS SQL Express benutze, kann ja die Datenbank max 2 oder 1 GB groß sein. Es geht mir darum so sparsam wie Möglich mit der Belegung des Festplattenspeichers umzugehen.
 
Du kannst bei varbinary angeben wieviele Bytes maximal gespeichert werden können (1 bis 8000). Wenn du keine exakte Zahl angibst sondern "MAX" nimmst, ist es als ob du 8000 wählst.
Du musst dir also überlegen, ob die Dateigröße der Bilder varriert oder nicht und dann dementsprechend varbinary oder binary wählen. Außerdem: Varbinary benötigt zu den Bild-Daten noch 2 Bytes mehr, da die Dateigröße auch gespeichert werden muss.

Eine andere elegante Lösung ist es, die Bilder in einem Verzeichnis zu speichern (mit unique filename) und dann in der SQL Tabelle nur den Dateinamen als String zu speichern.
 
Zuletzt bearbeitet:
Hm, wäre also egal ob man die Länge begrenzt oder nicht, für die Datenbank meine ich.
Das Problem mit den Verzeichnissen ist, wenn man die Verzeichnisse verschiebt und die DB nicht aktuallisiert, hat man einfach Datenmüll auf der DB. Klar es ist besser als die Bilder einfach abzuspeichern. Je nach dem wie groß die Abfrage sein kann, wird auch dementsprechend auch lange dauern die Daten nachzuladen. Möchte jetzt aber nicht mit Async Dataset arbeiten, da es jede menge um die Ohren fliegen kann.
Use varbinary(max) when the column data entries exceed 8,000 bytes.

Man kann auch die Bilder in eigene Tabelle packen und diese dann mit andere Tabelle Joinen. Oder ändert sich da an der Performance nichts?

Es geht jetzt allgemein um die Performance und nicht spezifisch für die Bilder mit 32x32 Pexil Auflösung!
 
Wenn man die Dateien in ein Verzeichnis speichert, sollte man in der Tabelle nur den Dateinamen speichern und den Verzeichnispfad in einer Konfigurations Tabelle hinterlegen, dann ist das Verschieben der Dateien kein Problem.

Das Auslagern in eine andere Tabelle wird dann einen Performance Gewinn bringen:
Wenn die Bilder in deiner Anwendung nur selten abgefragt werden.
Und die anderen Daten der Tabelle häufig abgefragt werden (ohne dem Bild).
 
danke...

das nur mit Dateinamen ist auch keine so schlechte Idee... hm, es ist sogar schneller als die DB abfrage, auf dauer und mit größeren Datensätzen meine ich. Hmmm obwohl, wenn es die lokale DB ist, macht es ja kein unterschied.
 
Zurück
Oben