Pregunta

varchar(255), varchar(256), nvarchar(255), nvarchar(256), nvarchar(max), etc.

256 parece un número agradable, redondo y que ocupa poco espacio.Pero he visto que se usa mucho el 255.¿Por qué?

¿Cuál es la diferencia entre varchar y nvarchar?

¿Fue útil?

Solución

VARCHAR(255).No utilizará los 255 caracteres de almacenamiento, sólo el almacenamiento que necesita.Es 255 y no 256 porque entonces tienes espacio para 255 más el terminador nulo (o byte de tamaño).

La "N" es para Unicode.Úselo si espera caracteres que no sean ASCII.

Otros consejos

En MS SQL Server (7.0 y versiones posteriores), los datos varchar se representan internamente con hasta tres valores:

  • La cadena real de caracteres, que irá de 0 a algo más de 8000 bytes (se basa en el tamaño de la página, las otras columnas almacenadas para la fila y algunos otros factores)
  • Dos bytes utilizados para indicar la longitud de la cadena de datos (lo que produce un valor de 0 a 8000+)
  • Si la columna admite valores NULL, un bit en la máscara de bits nulos de la fila (de modo que el estado nulo de hasta ocho columnas que aceptan valores NULL se puede representar en un byte)

La parte importante es ese indicador de longitud de datos de dos bytes.Si fuera un byte, sólo podría grabar correctamente cadenas de longitud de 0 a 255;con dos bytes, puede grabar cadenas de longitud 0 a algo más de 64000+ (específicamente, 2^16 -1).Sin embargo, la longitud de la página de SQL Server es de 8k, de donde proviene el límite de más de 8000 caracteres.(Hay cosas de desbordamiento de datos en SQL 2005, pero si sus cadenas van a ser tan largas, debería usar varchar(max).)

Entonces, no importa cuánto tiempo declare que su columna de tipo de datos varchar es (15, 127, 511), lo que realmente almacenará para todas y cada una de las filas es:

  • 2 bytes para indicar la longitud de la cadena.
  • La cadena real, es decir.el número de caracteres en esa cadena

Lo que me lleva a mi punto:Varios sistemas más antiguos usaban solo 1 byte para almacenar la longitud de la cadena, y eso lo limitaba a una longitud máxima de 255 caracteres, que no es tan largo.Con 2 bytes, no tienes ese límite arbitrario...por lo que recomiendo elegir un número que tenga sentido para el usuario (presuntamente no orientado técnicamente)., Me gustan 50, 100, 250, 500, incluso 1000.Dada esa base de más de 8000 bytes de almacenamiento, 255 o 256 son tan eficientes como 200 o 250, y menos eficiente a la hora de explicar las cosas a los usuarios finales.

Esto se aplica a datos de un solo byte (es decir,ansi, SQL_Latín1*_*General_CP1, et.Alabama.).Si tiene que almacenar datos para varias 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 la cantidad de caracteres, pero cada carácter real de datos requiere dos bytes de almacenamiento).Si tiene cadenas que probablemente superen los 8000 o los 4000 en nvarchar, necesitará utilizar los tipos de datos [n]varchar(max).

Y si desea saber por qué es tan importante ocupar espacio con bytes adicionales solo para realizar un seguimiento de la longitud de los datos, consulte http://www.joelonsoftware.com/articles/fog0000000319.html

Felipe

Hay un par de puntos más a considerar al definir char/varchar y las N variaciones.

En primer lugar, existe cierta sobrecarga al almacenar cadenas de longitud variable en la base de datos.Una buena regla general es usar CHAR para cadenas de menos de 10 caracteres de largo, ya que N/VARCHAR almacena tanto la cadena como la longitud y la diferencia entre almacenar corto cadenas en N/CHAR vs.N/VARCHAR menor de 10 no vale la pena por la longitud de la cadena.

En segundo lugar, una tabla en el servidor SQL se almacena en páginas de 8 KB, por lo que el tamaño máximo de la fila de datos es 8060 bytes (los otros 192 se utilizan para gastos generales de SQL).Es por eso que SQL permite una columna definida máxima de VARCHAR(8000) y NVARCHAR(4000).Ahora tu poder utilice VARCHAR(MAX) y la versión Unicode.Pero puede haber gastos adicionales asociados con eso.

Si no me equivoco, el servidor SQL intentará almacenar los datos en la misma página que el resto de la fila pero, si intenta poner demasiados datos en una columna VARCHAR(Max), los tratará como binarios y guárdelo en otra página.

Otra gran diferencia entre CHAR y VARCHAR tiene que ver con la división de páginas.Dado que SQL Server almacena datos en páginas de 8 KB, puede tener cualquier cantidad de filas de datos almacenadas en una página.Si usted ACTUALIZAR una columna VARCHAR con un valor lo suficientemente grande como para que la fila ya no quepa en la página, el servidor dividir esa página, eliminando algunos registros.Si la base de datos no tiene páginas disponibles y la base de datos está configurada para crecer automáticamente, el servidor primero hará crecer la base de datos para asignarle páginas en blanco, luego asignará páginas en blanco a la tabla y finalmente dividirá la página en dos.

Si va a admitir idiomas distintos del inglés, querrá utilizar nvarchar.

HTML debería funcionar siempre que contenga caracteres ASCII estándar.He usado nvarchar principalmente en bases de datos que eran compatibles con varios idiomas.

Porque hay 8 bits en 1 byte y así en 1 byte puedes almacenar hasta 256 valores distintos, lo cual es

0 1 2 3 4 5 ... 255

Tenga en cuenta que el primer número es 0, por lo que es un total de 256 números.

Entonces, si usas nvarchar(255), usará 1 byte para almacenar la longitud de la cadena, pero si se inclina en 1 y usa nvarchar(256), entonces está desperdiciando 1 byte más justo por ese artículo adicional de 1 artículo de 255 (ya que necesitas 2 bytes para almacenar el número 256).

Puede que esa no sea la implementación real del servidor SQL, pero creo que ese es el razonamiento típico para limitar las cosas a 255 sobre 256 elementos.

y nvarchar es para Unicode, que usa más de 2 bytes por carácter y
varchar es para texto ASCII normal que sólo utiliza 1 byte

IIRC, 255 es el tamaño máximo de un varchar en MySQL antes de que tuvieras que cambiar al tipo de datos de texto, o lo era en algún momento (en realidad, creo que ahora es más alto).Por lo tanto, mantenerlo en 255 podría brindarle cierta compatibilidad allí.Sin embargo, querrás consultar esto antes de actuar en consecuencia.

varchar vs nvarchar es algo así como ascii vs unicode.varchar está limitado a un byte por carácter, nvarchar puede usar dos.Es por eso que puedes tener un varchar(8000) pero solo un nvarchar(4000)

Tanto varchar como nvarchar ajustan automáticamente el tamaño del contenido, pero el número que define al declarar el tipo de columna es un máximo.

Los valores en "nvarchar" ocupan el doble de espacio en disco/memoria que "varchar" porque Unicode es de dos bytes, pero cuando declaras el tipo de columna estás declarando el número de caracteres, no de bytes.

Entonces, cuando define un tipo de columna, debe determinar el número máximo de caracteres que la columna necesitará contener y tenerlo como tamaño varchar (o nvarchar).

Una buena regla general es estimar la longitud máxima de la columna que debe contener y luego agregarle soporte para aproximadamente un 10 % más de caracteres para evitar problemas con datos inesperadamente largos en el futuro.

varchar(255) también era la longitud máxima en SQL Server 7.0 y versiones anteriores.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top