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 2GB
valor 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 8000
caracteres em uma varchar(max)
coluna.
Pergunta 1: Como os 8000
personagens 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?
fonte
varchar(max)
uma vez foi chamadotext
e foi tratado como um tipo de dados diferente.Respostas:
Eu posso entender por que você está entendendo errado - é um pouco complicado. Estes são todos válidos:
E sim, se você tentar obter dados de um campo VARCHAR (MAX) e alguém armazenar 2 GB nele, aperte o cinto.
fonte
and somebody stored 2GB in there, buckle up.
- Lembra-se com alguns arquivos blobDefinir 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).
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).
fonte