En MS SQL Server (7.0 en adelante), los datos varchar se representan internamente con hasta tres valores:
- la cadena real de caracteres, que será de 0 a algo más de 8000 bytes (que se basa en tamaño de página, las otras columnas almacenadas para la fila y algunos otros factores)
- Dos bytes utilizados para indicar cuánto tiempo es la cadena de datos (que produce un valor de 0 a 8000+)
- Si la columna está nullable, un bit en la máscara de bits nula de la fila (por lo que el estado nulo de hasta ocho columnas con nulos puede ser representado en un byte)
La parte importante es el indicador de longitud de datos de dos bytes. Si fue un byte, solo puede grabar cadenas de longitud de 0 a 255; con dos bytes, puede grabar cadenas de longitud 0 en algo superior a 64000+ (específicamente, 2^16 -1). Sin embargo, la longitud de la página del Servidor SQL es 8k, que es de donde proviene ese límite de más de 8000 caracteres. (Hay elementos de desbordamiento de datos en SQL 2005, pero si sus cadenas van a durar tanto, debería ir con varchar (max).)
tanto, no importa cuánto tiempo usted declara su columna de tipo de datos varchar a ser (15, 127, 511), lo que en realidad se va a almacenar para todos y cada fila es:
- 2 bytes para indicar longitud de la cadena es
- la cadena real, es decir, el número de caracteres de esa cadena
lo que me pone a mi punto: una serie de sistemas antiguos utiliza sólo 1 byte para almacenar la longitud de la cadena, y que te limita a una longitud máxima de 255 caracteres, que no es todo t sombrero de largo. Con 2 bytes, no tiene ese límite arbitrario ... por lo que recomiendo elegir un número que tenga sentido para el usuario (supuestamente no orientado técnicamente). , Me gustan 50, 100, 250, 500, incluso 1000. Dado que la base de 8000+ bytes de almacenamiento, 255 o 256 es tan eficiente como 200 o 250, y menos eficiente cuando llega el momento de explicar las cosas al los usuarios finales.
Esto se aplica a datos de un solo byte (es decir, ansii, SQL _ Latin1 * _ * General_CP1, et al.). Si tiene que almacenar datos para múltiples páginas de códigos o idiomas usando diferentes alfabetos, necesitará trabajar con el tipo de datos nvarchar (que creo que funciona igual, dos bytes para el número de caracteres, pero cada carácter real de datos requiere dos bytes de almacenamiento). Si tiene cadenas que probablemente superen los 8000, o más de 4000 en nvarchar, necesitará usar los tipos de datos [n] varchar (max).
Y si quieres saber por qué es tan importante para ocupar espacio con bytes adicionales sólo para realizar un seguimiento de cuánto tiempo los datos es, echa un vistazo a http://www.joelonsoftware.com/articles/fog0000000319.html
Philip
¿No 1 byte por Char para varchar significa que 255 versus 256 aún agregará un byte para el terminador pase lo que pase? ¿Entonces 256 realmente no te está llevando por encima de nada? –
@nemo I significa la información que es la longitud de la cadena ... * NO * que tenga nada que ver con la cadena en sí ... nulo o no terminado no es el punto. Lo siento si no estaba claro. – chakrit
Lo siento, lo escribí mal, pero internamente 256 contra 255 lo empujan sobre algo? Quiero decir, podría entender si un char era poco y la longitud era un poco, por lo que 256 bits + longitud te empujaría al siguiente byte, pero no entiendo qué 256 bytes + 1 byte te está costando además de 1 byte más. –