Comprender la columna varchar (max) 8000 y por qué puedo almacenar más de 8000 caracteres en ella

13

De este documento de Microsoft, +

n define la longitud de la cadena y puede ser un valor de 1 a 8,000. max indica que el tamaño máximo de almacenamiento es 2 ^ 31-1 bytes (2 GB). El tamaño de almacenamiento es la longitud real de los datos ingresados ​​+ 2 bytes.

Por favor, ayúdame a entender esto.

Los caracteres máximos para varchar parecen ser 8000, que es mucho menos que el 2GBvalor de los datos.

Veo que hay registros en esta varchar(max)columna de una tabla específica que tienen len(mycolumn)> 100 000. Por lo tanto, sé que puedo obtener mucho más que 8000caracteres en una varchar(max)columna.

Pregunta 1: ¿Cómo 8000entran en juego los personajes y dónde debo estar al tanto?

Pregunta 2 : ¿una consulta de lector de datos .net a esta columna siempre devolverá el resultado completo con más de 100 000 caracteres?

Peter PitLock
fuente
Tenga en cuenta que varchar(max)una vez se llamó texty se trató como un tipo de datos diferente.
Sr. Lister
Tal vez leer esto ? Está relacionado con los tamaños de página de 8K. Los valores demasiado grandes para caber en una sola página (el límite es en realidad un poco más grande que 8000) se guardan en páginas LOB_DATA (Objeto grande).
Justin

Respuestas:

30

Puedo ver por qué no entiendes esto, es un poco complicado. Todos estos son válidos:

  • VARCHAR (1): una cadena de caracteres
  • VARCHAR (4000) - 4,000 caracteres
  • VARCHAR (8000) - 8,000 caracteres - y si usa un número para la definición de este campo, ese es el NÚMERO más alto que puede usar, pero mire esto:
  • VARCHAR (MAX): ese tiene hasta 2 GB.

Y sí, si intenta obtener datos de un campo VARCHAR (MAX) y alguien almacenó 2 GB allí, abróchese el cinturón.

Brent Ozar
fuente
3
and somebody stored 2GB in there, buckle up.- Estuve allí con algunos archivos de blob
Ruslan
7

Pregunta 1: ¿Cómo entran en juego los 8000 personajes y dónde debo estar al tanto?

Establecer n en 8000 hace que entren en juego 8000 personajes. Debe conocer las referencias de Precisión, Escala y Longitud (Transact-SQL) sobre char, nchar, nvarchar y varchar. Por el contrario, establecer n en max (sin comillas) hace que SQL Server almacene (y devuelva) el número máximo de bytes (como se menciona en su cotización).

Pregunta 2: ¿una consulta de lector de datos .net a esta columna siempre devolverá el resultado completo con más de 100 000 caracteres?

Esta es una pregunta .Net (no un servidor SQL), pero el lector de datos .Net obtiene una secuencia de bytes. Un byte no es un carácter y SQL Server devuelve bytes (no caracteres). Si n se establece en 8000 y el tipo de datos es nvarchar, SQL Server devuelve hasta 8000 bytes, que el lector de datos .Net puede interpretar como 4000 caracteres Unicode. Si n se establece en 8000 y el tipo de datos es varchar, SQL Server devuelve hasta 8000 bytes, que el lector de datos .Net puede interpretar como hasta 8000 caracteres ANSI. Si n se establece en max y el tipo de datos es nvarchar, SQL Server devuelve hasta 2 ^ 31-1 bytes, que el lector de datos .Net puede interpretar en hasta (2 ^ 31-1) / 2 caracteres. Si n se establece en max y el tipo de datos es varchar, SQL Server devuelve hasta 2 ^ 31-1 bytes, que el lector de datos .Net puede interpretar como hasta 2 ^ 31-1 caracteres ANSI.

Si elige usar char o varchar (en lugar de nchar o nvarchar) porque pueden almacenar más "caracteres" (más exactamente: bytes), debe tener en cuenta que muchos caracteres Unicode no tienen caracteres ANSI equivalentes (por lo tanto, una gran parte de nuestro los usuarios del mundo no podrán ver sus caracteres localizados / nativos en su aplicación).

Cuenta
fuente