Comprensione varchar (max) 8000 colonna e perché posso memorizzare più di 8000 caratteri al suo interno


13

Da questo documento Microsoft, +

n definisce la lunghezza della stringa e può essere un valore compreso tra 1 e 8.000. max indica che la dimensione massima di archiviazione è 2 ^ 31-1 byte (2 GB). La dimensione di archiviazione è la lunghezza effettiva dei dati immessi + 2 byte.

Per favore aiutami a capire questo.

I caratteri massimi per varchar sembrano essere 8000, il che è molto meno del 2GBvalore dei dati.

Vedo che ci sono record in questa varchar(max)colonna di una tabella specifica che hanno len(mycolumn)> 100 000. Quindi so di poter ottenere molto più che 8000caratteri in una varchar(max)colonna.

Domanda 1: Come 8000entrano in gioco i personaggi e dove dovrei esserne consapevole?

Domanda 2 : una query .net datareader in questa colonna restituirà sempre il risultato completo con oltre 100000 caratteri?


Si noti che varchar(max)una volta veniva chiamato texted è stato trattato come un diverso tipo di dati.
Mr Lister,

Forse leggi questo ? È relativo alle dimensioni di pagina 8K. I valori troppo grandi per adattarsi a una singola pagina (il limite è in realtà leggermente più grande di 8000) vengono salvati in pagine LOB_DATA (OBject grande).
Giustino,

Risposte:


30

Posso capire perché lo fraintendi: è un po 'complicato. Questi sono tutti validi:

  • VARCHAR (1) - una stringa di caratteri
  • VARCHAR (4000) - 4.000 caratteri
  • VARCHAR (8000) - 8.000 caratteri - e se usi un numero per la definizione di questo campo, è il NUMERO più alto che puoi usare, ma guarda questo:
  • VARCHAR (MAX) - quello contiene fino a 2 GB.

E sì, se provi a ottenere dati da un campo VARCHAR (MAX) e qualcuno ha archiviato 2 GB, allacciati.


3
and somebody stored 2GB in there, buckle up.- Sono stato lì con alcuni file BLOB
Ruslan,

7

Domanda 1: Come entrano in gioco gli 8000 personaggi e dove dovrei esserne consapevole?

L'impostazione di n su 8000 fa entrare in gioco 8000 caratteri. È necessario essere consapevoli dei riferimenti di precisione, scala e lunghezza (Transact-SQL) su char, nchar, nvarchar e varchar. Al contrario, l'impostazione di n su max (senza virgolette) fa sì che SQL Server memorizzi (e restituisca) il numero massimo di byte (come indicato nel preventivo).

Domanda 2: una query .net datareader in questa colonna restituirà sempre il risultato completo con oltre 100000 caratteri?

Questa è una domanda .Net (non un server SQL), ma il datareader .Net recupera un flusso di byte. Un byte non è un carattere e SQL Server restituisce byte (non caratteri). Se n è impostato su 8000 e il tipo di dati è nvarchar, SQL Server restituisce fino a 8000 byte, che il datareader .Net può interpretare come 4000 caratteri Unicode. Se n è impostato su 8000 e il tipo di dati è varchar, SQL Server restituisce fino a 8000 byte, che il datareader .Net può interpretare fino a 8000 caratteri ANSI. Se n è impostato su max e il tipo di dati è nvarchar, SQL Server restituisce fino a 2 ^ 31-1 byte, che il datareader .Net può interpretare fino a (2 ^ 31-1) / 2 caratteri. Se n è impostato su max e il tipo di dati è varchar, SQL Server restituisce fino a 2 ^ 31-1 byte, che il datareader .Net può interpretare fino a 2 ^ 31-1 caratteri ANSI.

Se scegli di utilizzare char o varchar (invece di nchar o nvarchar) perché possono memorizzare più "caratteri" (più precisamente: byte), devi essere consapevole che molti caratteri Unicode non hanno caratteri ANSI equivalenti (quindi una grande parte del nostro gli utenti del mondo non saranno in grado di vedere i loro caratteri localizzati / nativi nella tua app).

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.