Utilizzare i campi BLOB di MySQL con ASP.NET

di Moreno Gentili, in ASP.NET,

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
o
TINYBLOB
2^8-1 255
TEXT
o
BLOB
2^16-1 (64K-1) 65.535
MEDIUMTEXT
o
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).

Immagine

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.

3 pagine in totale: 1 2 3
Contenuti dell'articolo

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti