2008-09-10 19 views

Respuesta

10

VARCHAR (255). No usará los 255 caracteres de almacenamiento, solo 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.

3

Si va a admitir idiomas que no sean el inglés, querrá usar nvarchar.

HTML debe estar bien, siempre que contenga caracteres ASCII estándar. He usado nvarchar principalmente en bases de datos que son compatibles con varios idiomas.

2

IIRC, 255 es el tamaño máximo de un varchar en MySQL antes de que tuviera que cambiar al tipo de datos de texto, o fue en algún momento (en realidad, creo que es más alto ahora). Así que mantenerlo en 255 podría comprarle algo de compatibilidad allí. Sin embargo, querrá buscar esto antes de actuar sobre él.

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

2

Ambos, varchar y nvarchar de tamaño automático para el contenido, pero el número que define al declarar el tipo de columna es un máximo.

Los valores en "nvarchar" ocupan el doble del espacio de disco/memoria como "varchar" porque el unicode es de dos bytes, pero cuando declaras el tipo de columna, declaras la cantidad de caracteres, no los bytes.

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

Una buena regla de oro es estimar la longitud máxima de aguijón que la columna necesita contener, luego agregue soporte para aproximadamente 10% más de caracteres para evitar problemas con datos inesperadamente largos en el futuro.

3

Debido a que hay 8-bits en 1 byte y así en 1 byte puede almacenar hasta 256 valores distintos que es

0 1 2 3 4 5 ... 255 

Nota el primer número es 0, por lo que es un total de números.

tanto, si utiliza nvarchar (255) Se va a utilizar 1 byte para almacenar la longitud de la cadena pero si se vuelque en 1 y utilizar nvarchar (256), entonces usted está perdiendo más de 1 byte solo para ese artículo extra 1 de 255 (ya que necesita 2 bytes para almacenar el número 256).

Esa podría no ser la implementación real del servidor SQL, pero creo que es el razonamiento típico para limitar cosas en 255 más de 256 elementos.

y nvarchar es para Unicode, que utilizan 2+ bytes por carácter y
varchar es para el texto ASCII normal, que sólo se utiliza 1 byte

+0

¿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? –

+0

@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

+0

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. –

4

Hay un par de otros puntos a tener en cuenta al definir char/varchar y las N variaciones.

Primero, hay algo de sobrecarga para 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 longitud, ya que N/VARCHAR almacena tanto la cadena como la longitud y la diferencia entre almacenar cadenas cortas en N/CHAR vs. N/VARCHAR en 10 isn No vale la sobrecarga de la longitud de la cuerda.

En segundo lugar, una tabla en el servidor SQL se almacena en páginas de 8KB, por lo que el tamaño máximo de la fila de datos es de 8060 bytes (los otros 192 se usan para sobrecarga por SQL). Es por eso que SQL permite una columna máxima definida de VARCHAR (8000) y NVARCHAR (4000). Ahora, usted puede usar VARCHAR (MAX) y la versión Unicode. Pero puede haber una sobrecarga adicional asociada 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 (Máx), tratará es binario y lo almacena en otra página.

Otra gran diferencia entre CHAR y VARCHAR tiene que ver con las divisiones de página. Dado que SQL Server almacena datos en páginas de 8KB, puede tener cualquier cantidad de filas de datos almacenados en una página. Si ACTUALIZA una columna VARCHAR con un valor que sea lo suficientemente grande como para que la fila ya no quepa en la página, el servidor dividirá esa página, moviéndose de un número de 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.

+0

Creo que el tamaño máximo de fila está realmente más cerca de 8060 bytes ... –

2

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

17

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

Cuestiones relacionadas