Entendendo a coluna varchar (max) 8000 e por que posso armazenar mais de 8000 caracteres nela

13

A partir deste doc Microsoft, +

n define o comprimento da string e pode ser um valor de 1 a 8.000. max indica que o tamanho máximo de armazenamento é 2 ^ 31-1 bytes (2 GB). O tamanho do armazenamento é o comprimento real dos dados inseridos + 2 bytes.

Por favor me ajude a entender isso.

Os caracteres máximos para varchar parecem ser 8000, o que é muito menos que o 2GBvalor dos dados.

Vejo que existem registros nesta varchar(max)coluna de uma tabela específica com len(mycolumn)> 100 000. Portanto, sei que posso obter muito mais do que 8000caracteres em uma varchar(max)coluna.

Pergunta 1: Como os 8000personagens entram em cena e onde devo estar ciente disso?

Pergunta 2 : uma consulta do datareader .net a esta coluna sempre retornará o resultado completo com mais de 100.000 caracteres?

Peter PitLock
fonte
Observe que varchar(max)uma vez foi chamado texte foi tratado como um tipo de dados diferente.
Sr. Lister
Talvez leu isso ? Está relacionado aos tamanhos de página de 8K. Valores muito grandes para caber em uma única página (o limite é realmente um pouco maior que 8000) são salvos em páginas LOB_DATA (OBject grande).
237 Justin justin

Respostas:

30

Eu posso entender por que você está entendendo errado - é um pouco complicado. Estes são todos válidos:

  • VARCHAR (1) - uma sequência de caracteres
  • VARCHAR (4000) - 4.000 caracteres
  • VARCHAR (8000) - 8.000 caracteres - e se você usar um número para a definição desse campo, esse é o NÚMERO mais alto que você pode usar, mas observe:
  • VARCHAR (MAX) - aquele suporta até 2 GB.

E sim, se você tentar obter dados de um campo VARCHAR (MAX) e alguém armazenar 2 GB nele, aperte o cinto.

Brent Ozar
fonte
3
and somebody stored 2GB in there, buckle up.- Lembra-se com alguns arquivos blob
Ruslan
7

Pergunta 1: Como os 8000 caracteres entram em cena e onde devo estar ciente disso?

Definir n como 8000 faz com que 8000 caracteres entrem em jogo. Você precisa estar ciente das referências de precisão, escala e comprimento (Transact-SQL) sobre char, nchar, nvarchar e varchar. Por outro lado, definir n como max (sem aspas) faz com que o SQL Server armazene (e retorne) o número máximo de bytes (conforme mencionado em sua cotação).

Pergunta 2: uma consulta ao datar .net nesta coluna sempre retornará o resultado completo com mais de 100.000 caracteres?

Esta é uma pergunta .Net (não um SQL Server), mas o datareader .Net busca um fluxo de bytes. Um byte não é um caractere e o SQL Server retorna bytes (não caracteres). Se n estiver definido como 8000 e o tipo de dados for nvarchar, o SQL Server retornará até 8000 bytes, que o datareader .Net pode interpretar como 4000 caracteres Unicode. Se n estiver definido como 8000 e o tipo de dados for varchar, o SQL Server retornará até 8000 bytes, que o datareader .Net pode interpretar como tendo até 8000 caracteres ANSI. Se n estiver definido como max e o tipo de dados for nvarchar, o SQL Server retornará até 2 ^ 31-1 bytes, que o datareader .Net pode interpretar com até (2 ^ 31-1) / 2 caracteres. Se n for definido como max e o tipo de dados for varchar, o SQL Server retornará até 2 ^ 31-1 bytes, que o datareader .Net pode interpretar com até 2 ^ 31-1 caracteres ANSI.

Se você optar por usar char ou varchar (em vez de nchar ou nvarchar) porque eles podem armazenar mais "caracteres" (com mais precisão: bytes), você deve estar ciente de que muitos caracteres Unicode não possuem caractere ANSI equivalente (portanto, uma grande parte de nossos os usuários do mundo não conseguirão ver seus caracteres nativos / localizados no seu aplicativo).

Conta
fonte