nvarchar (max) vs NText


183

Quali sono i vantaggi e gli svantaggi dell'utilizzo dei tipi di dati nvarchar(max)vs. NTextin SQL Server? Non ho bisogno di compatibilità con le versioni precedenti, quindi va bene che nvarchar(max)non è supportato nelle versioni precedenti di SQL Server.

Modifica: a quanto pare la domanda vale anche per TEXTe IMAGEvs. varchar(max)e varbinary(max), per chi cerca successivamente quei tipi di dati.

Risposte:


197

I vantaggi sono che puoi usare funzioni come LENe LEFTon nvarchar(max)e non puoi farlo contro ntexte text. È anche più facile da lavorare nvarchar(max)rispetto a textdove dovevi usare WRITETEXTe UPDATETEXT.

Inoltre, text, ntext, ecc, vengono sconsigliata ( http://msdn.microsoft.com/en-us/library/ms187993.aspx )


12
SQL Server 2016 apparentemente li supporterà comunque.
Confluenza,

1
@Confluence Storicamente, i tipi di dati text e nText sono più vecchi di varchar e nvarchar per quanto riguarda la loro esistenza in SQL Server?
RBT

Non DEVI usare WRITETEXT e UPDATETEXT. Forse nel 2010 l'hai fatto! Interessato per ulteriori informazioni.
Simon_Weaver,

38

VARCHAR(MAX)è abbastanza grande per accogliere il TEXTcampo. TEXT, NTEXTE IMAGEtipi di dati di SQL Server 2000 saranno deprecati nella versione futura di SQL Server, SQL Server 2005 fornisce la compatibilità all'indietro per i tipi di dati, ma si consiglia di utilizzare nuovi tipi di dati che sono VARCHAR(MAX), NVARCHAR(MAX)e VARBINARY(MAX).


32

ntextmemorizzerà sempre i suoi dati in una pagina di database separata, mentre nvarchar(max)proverà a memorizzare i dati all'interno del record del database stesso.

Quindi nvarchar(max)è un po 'più veloce (se hai testo più piccolo di 8 kB). Ho anche notato che le dimensioni del database aumenteranno leggermente più lentamente, anche questo è buono.

Go nvarchar(max).


13

nvarchar(max)è quello che vuoi usare. Il più grande vantaggio è che puoi usare tutte le funzioni di stringa T-SQL su questo tipo di dati. Questo non è possibile con ntext. Non sono a conoscenza di alcun reale svantaggio.


Quello che non capisco è che dicono di andare avanti, nvarchar(max)ma questo mi limita a 4000 caratteri. Cosa succede se desidero che un campo contenga più di quello?
VoidKing,

2
nvarchar (max) non ti limita a 4000 caratteri. Hai un numero illimitato di personaggi. Inoltre, text e ntext sono stati deprecati da SQL Server. Ciò significa che in una versione futura non saranno più supportati.
Randy Minder,

OIC, sto usando SQL Server CE, che limita i miei nvarchar(max)a 4000 caratteri. Quindi, per SQL Server Compact, non ho altra scelta che utilizzare ntextin alcuni casi. Quando lo interromperanno, suppongo che dovrò semplicemente non aggiornare alcuni siti.
VoidKing,

1
@RandyMinder nvarchar (max) non è spazio di archiviazione illimitato. Secondo la documentazione di SQL Server "max indica che la dimensione massima della memoria è 2 ^ 31-1 byte (2 GB). La dimensione della memoria, in byte, è due volte la lunghezza effettiva dei dati immessi + 2 byte."
Shiv,


4

Il più grande svantaggio di Text(insieme a NTexte Image) è che verrà rimosso in una versione futura di SQL Server, come dalla documentazione . Ciò renderà effettivamente più difficile l'aggiornamento dello schema quando verrà rilasciata quella versione di SQL Server.


3

Volevo aggiungere la mia esperienza con la conversione. Avevo molti textcampi nell'antico codice Linq2SQL. Questo per consentire la ricostruzione ONLINE delletext colonne presenti negli indici .

In primo luogo ho conosciuto i vantaggi per anni, ma ho sempre pensato che la conversione avrebbe comportato alcune lunghe e spaventose query in cui SQL Server avrebbe dovuto ricostruire la tabella e copiare tutto, abbattendo i miei siti Web e aumentando il mio battito cardiaco.

Ero anche preoccupato che Linq2SQL potesse causare errori se stesse facendo una sorta di verifica del tipo di colonna.

Felice di segnalare, tuttavia, che i comandi ALTER sono tornati ISTANTANEAMENTE, quindi stanno sicuramente cambiando solo i metadati della tabella. Potrebbe esserci del lavoro offline in corso per riportare i dati <8000 caratteri nella tabella, ma il comando ALTER è stato istantaneo.

Ho eseguito quanto segue per trovare tutte le colonne che necessitano di conversione:

SELECT concat('ALTER TABLE dbo.[', table_name, '] ALTER COLUMN [', column_name, '] VARCHAR(MAX)'), table_name, column_name
FROM information_schema.columns where data_type = 'TEXT' order by table_name, column_name

SELECT concat('ALTER TABLE dbo.[', table_name, '] ALTER COLUMN [', column_name, '] NVARCHAR(MAX)'), table_name, column_name
FROM information_schema.columns where data_type = 'NTEXT' order by table_name, column_name

Questo mi ha dato un bel elenco di query, che ho appena selezionato e copiato in una nuova finestra. Come ho detto, correre questo è stato istantaneo.

inserisci qui la descrizione dell'immagine

Linq2SQL è piuttosto antico: utilizza un designer su cui trascinare le tabelle. La situazione potrebbe essere prima più complessa per il codice EF, ma non l'ho ancora affrontato.


1

Voglio aggiungere che è possibile utilizzare la clausola .WRITE per aggiornamenti parziali o completi e aggiunte ad alte prestazioni ai varchar(max)/nvarchar(max)tipi di dati.

Qui puoi trovare un esempio completo dell'uso della .WRITEclausola.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.