A volte vi sarete chiesti se fosse più opportuno inserire piccoli file o immagini direttamente nel database o se invece fosse meglio memorizzarne solamente il percorso. Sebbene sia più comune per un campo BLOB contenere file, questo articolo mostrerà come poter archiviare in esso anche dei dati "normali" come stringhe e quando conviene farlo.
I campi BLOB in MySQL
In MySQL, esistono due tipi di campi in grado di contenere grandi quantità di dati: essi sono text e blob e sono tra loro molto simili. La tabella in basso mostra la capienza di questi due campi e delle loro varianti TINY, MEDIUM o LONG.
| Tipo | Lunghezza max | Bytes |
TINYTEXTTINYBLOB | 2^8-1 | 255 |
TEXTBLOB | 2^16-1 (64K-1) | 65.535 |
MEDIUMTEXTMEDIUMBLOB | 2^24-1 (16M-1) | 16.777.215 |
LONGBLOB | 2^32-1 (4G-1) | 4.294.967.295 |
Ma quali sono le differenze tra i due?
MySQL effettua l'ordinamento e la ricerca in maniera case-sensitive per il campo blob, mentre il contrario (case-insensitive) accade per il campo text.
E? importante tenere a mente che nel campo text i dati sono memorizzati come stringa, mentre nel blob in formato binario. Spiegazioni più dettagliate possono essere trovate consultando la guida on-line di MySQL .
Stringa o binario?
Che cosa cambia se memorizzo dati in formato stringa o binario?
In teoria, niente. Sono solo due modi per rappresentare la stessa quantità di dati.
Qunado si parla di "binario" si intende una memorizzazione fatta mediante l'utilizzo di un array di byte con n elementi, dove n è la lunghezza dei dati (o per meglio dire: la dimensione del file). L'array di byte, per sua costituzione, conterrà quindi in ogni suo elemento, un numero da 0 a 255.
La stringa può essere vista invece (passatemi la definizione) come un array di 1 solo elemento che contiene tanti caratteri. Quest'unico elemento ha lunghezza n .
Attraverso le funzioni illustrate di seguito, potremo passare da una rappresentazione all'altra mantenendo i dati integri.
Function BinToStr(input() As Byte) As String
Dim output As String = ""
if input.length> 0 then
Dim i As Byte
for each i in input
output &= Chr(i)
next
end if
return output
End Function
Function StrToBin(input As String) As Byte()
Dim output() As Byte
if input.length> 0 then
Dim i As Integer
for i=0 to input.length-1
output.setValue(Asc(input.substring(i,1)),i)
next
end if
return output
End FunctionLa funzione BinToStr accetta come parametro un'array di byte e restituisce una stringa. La funzione StrToBin invece, fa esattamente il contrario.
Facciamo ora un piccolo test:
Dim i As Integer
Dim caratteri As String = ""
for i = 0 to 255
caratteri &= Chr(i)
next
'caratteri è una stringa che contiene tutto il set Ascii
Response.write(caratteri = BinToStr(StrToBin(caratteri)))Se la variabile caratteri è uguale a se stessa trasposta in binario e poi di nuovo in stringa, avremmo dimostrato che la trasformazione è possibile e reversibile.
Il valore stampato dal Response.Write sarà true.
Piccola nota: scrivere
Response.Write(caratteri)oppure
Response.BinaryWrite(StrToBin(caratteri))produce lo stesso output.
La reversibilità dimostrata via codice non trova però riscontro se per la memorizzazione utilizziamo il campo Text di MySQL.
Text è stato pensato per contenere testo (come dice il nome stesso) e non è in grado di conservare all?interno tutto il set di caratteri ASCII che comprende anche caratteri non supportati. Si può dire che Text può contenere solo caratteri stampabili che sono un sottoinsieme degli ASCII.
I valori ASCII dei caratteri stampabili sono compresi (molto approssimativamente) in questi intervalli:
da 9 a 13; da 32 a 126; da 145 a 146; da 160 a 255.
Si verificherà una perdita di dati qualora si vadano a memorizzare in un campo text dei caratteri non stampabili.
Tale problema non si verifica invece con un campo blob, capace di contenere tutto il set.
Vediamo ora come poter salvare e recuperare dati da un campo blob.
Classi .NET per l'accesso a MySQL
Esistono diversi strumenti per l'interazione con MySQL usando .NET. Uno da tenere sott'occhio (perchè open-source) è questo
MySQL.NET
E' un progetto da scaricare e si compone di due dll da inserire nella GAC (o copiare nella cartella /bin del sito web).

L'immagine mostra tutte le classi contenute nel namespace ByteFX.Data.MySQLClient che ha il supporto nativo per MySQL. Come si può notare, nell'elenco ci sono tutti gli strumenti che troviamo anche in System.Data.OleDb, per cui l'adattamento del nostro codice all'uso di queste classi sarà abbastanza indolore.
Implementando le stesse interfacce contenute nel namespace System.Data, la cosa non deve meravigliare.
Contenuti dell'articolo
Per inserire un commento, devi registrarti alla nostra community.








Difficoltà

Stampa
Download 


