Utilizzo dei dati di tipo text e image

Nota importanteImportante

Questa caratteristica verrà rimossa a partire da una delle prossime versioni di Microsoft SQL Server. Evitare di utilizzare questa caratteristica in un nuovo progetto di sviluppo e prevedere interventi di modifica nelle applicazioni in cui è attualmente implementata. In alternativa, utilizzare i tipi di dati varchar(max), nvarchar(max) e varbinary(max). Per ulteriori informazioni, vedere Utilizzo di tipi di dati per valori di grandi dimensioni.

In Microsoft SQL Server è possibile archiviare stringhe composte da oltre 8.000 caratteri e dati binari di oltre 8.000 byte in tipi di dati speciali denominati text e image. Le stringhe Unicode composte da più di 4.000 caratteri vengono archiviate nel tipo di dati ntext.

Si supponga, ad esempio, di dover importare nel database di SQL Server un file di testo (txt) di grandi dimensioni contenente informazioni sui clienti. Si supponga inoltre di dover archiviare questi dati come unico blocco anziché integrarli in più colonne delle tabelle di dati. A tale scopo è possibile creare una colonna di tipo text. Se tuttavia è necessario archiviare una serie di immagini archiviate in formato TIFF, ognuna delle quali ha dimensioni pari a 10 KB, è necessario creare una colonna di tipo image.

Se i dati di testo da archiviare sono in formato Unicode, utilizzare il tipo di dati ntext. Ad esempio, è probabile che una lettera tipo destinata a clienti stranieri contenga elementi ortografici e caratteri di altre lingue. Questi dati devono essere archiviati in una colonna di tipo ntext.

A ogni valore di dati di tipo text e ntext corrispondono regole di confronto specifiche. Le regole di confronto definiscono attributi specifici quali ad esempio la rilevanza della distinzione tra maiuscole e minuscole o degli accenti. Le regole di confronto per i valori di tipo text specificano inoltre una tabella codici che definisce gli schemi di bit utilizzati per la rappresentazione di ciascun carattere. Ogni valore ntext utilizza la stessa tabella codici Unicode per tutte le regole di confronto. A ogni database sono associate regole di confronto predefinite. Quando viene creata una colonna di tipo text o ntext, vi vengono assegnate automaticamente le regole di confronto predefinite del database, a meno che non vengano definite regole di confronto specifiche tramite la clausola COLLATE. Se si uniscono o si confrontano due valori di tipo text o ntext con regole di confronto diverse, le regole di confronto da utilizzare vengono scelte in base alle regole relative alle precedenze.

I dati di tipo image vengono archiviati sotto forma di stringa di bit e non vengono interpretati da SQL Server. L'interpretazione dei dati in una colonna di tipo image deve essere eseguita dall'applicazione. Ad esempio, un'applicazione potrebbe archiviare i dati in una colonna di tipo image nei formati BMP, TIFF, GIF o JPEG. L'applicazione che legge i dati della colonna di tipo image deve essere in grado di riconoscere il formato dei dati e visualizzarli in modo corretto. L'unica funzione della colonna image è fornire una posizione di archiviazione per il flusso di bit che compone il valore dei dati dell'immagine.

Utilizzo dell'opzione text in row per l'archiviazione di valori text, ntext e image

In genere, le stringhe di tipo text, ntext o image sono stringhe binarie o di caratteri di grandi dimensioni (fino a 2 GB) archiviate all'esterno di una riga di dati. La riga di dati include solo un puntatore di testo da 16 byte che indica il nodo radice di un albero costituito da puntatori interni che mappano le pagine in cui sono archiviati i frammenti di stringa.

SQL Server consente l'archiviazione di valori text, ntext e image di dimensioni medio-piccole in una riga di dati, con un conseguente incremento della velocità di accesso delle query a questi valori.

Se la stringa text, text, ntext o image viene archiviata nella riga di dati, per scriverla o leggerla SQL Server non deve accedere a una pagina o a un set di pagine distinti. In questo modo, le operazioni di lettura e scrittura delle stringhe text, ntext o image all'interno della riga sono veloci quasi quanto quelle di lettura e scrittura delle stringhe varchar, nvarchar o varbinary.

Per archiviare stringhe text, ntext o image nella riga di dati, abilitare l'opzione text in row utilizzando la stored procedure sp_tableoption.

sp_tableoption N'MyTable', 'text in row', 'ON';

Facoltativamente, per le stringhe di tipo text, ntext e image archiviate in una riga di dati è possibile specificare una lunghezza massima compresa tra 24 e 7000 byte:

sp_tableoption N'MyTable', 'text in row', '1000';

Se si specifica 'ON' anziché un valore specifico, per impostazione predefinita il limite massimo viene impostato su 256 byte, con cui è possibile ottenere la maggior parte dei vantaggi a livello di prestazioni. Si tratta di un valore sufficientemente elevato da garantire l'archiviazione nelle righe di stringhe di piccole dimensioni e di puntatori di testo radice, ma non tanto elevato da ridurre il numero di righe di ogni pagina fino a influire sulle prestazioni.

Sebbene in generale sia consigliabile non impostare un valore minori di 72, è altrettanto importante evitare l'impostazione di valori troppo elevati, in particolare per le tabelle in cui la maggior parte delle istruzioni non fa riferimento a colonne di tipo text, ntext, e image o quando sono presenti più colonne di tipo text, ntext e image.

È inoltre possibile utilizzare sp_tableoption per disattivare l'opzione, specificando il valore di opzione 'OFF' o 0:

sp_tableoption N'MyTable', 'text in row', 'OFF';