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 |
TINYTEXT TINYBLOB | 2^8-1 | 255 |
TEXT BLOB | 2^16-1 (64K-1) | 65.535 |
MEDIUMTEXT MEDIUMBLOB | 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 unarray 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 Function
La 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.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.