A menudo ve que los campos de la base de datos tienen una magnitud de 255 caracteres, ¿cuál es la razón tradicional / histórica por la que? Supongo que tiene que ver con los límites de paginación / memoria y el rendimiento, pero la distinción entre 255 y 256 siempre me ha confundido.
varchar(255)
Teniendo en cuenta que esto es una capacidad o magnitud, no un indexador , ¿por qué se prefiere 255 sobre 256? ¿Se reserva un byte para algún propósito (terminador o nulo o algo)?
Presumiblemente varchar (0) no tiene sentido (tiene capacidad cero)? ¿En qué caso 2 ^ 8 de espacio deberían ser 256 seguramente?
¿Existen otras magnitudes que brinden beneficios de rendimiento? Por ejemplo, ¿varchar (512) tiene menos rendimiento que varchar (511) o varchar (510)?
¿Es este valor el mismo para todas las bases de datos de relaciones, antiguas y nuevas?
Descargo de responsabilidad : soy un desarrollador, no un DBA, uso tamaños y tipos de campo que se adaptan a mi lógica de negocios donde se conoce, pero me gustaría saber la razón histórica de esta preferencia, incluso si ya no es relevante (pero incluso más si aún es relevante).
Editar:
Gracias por las respuestas, parece haber cierto consenso de que se usa un byte para almacenar el tamaño, pero esto no resuelve el asunto definitivamente en mi mente.
Si los metadatos (longitud de la cadena) se almacenan en la misma memoria / disco contiguo, tiene sentido. 1 byte de metadatos y 255 bytes de datos de cadena, se adaptarían muy bien entre sí y encajarían en 256 bytes contiguos de almacenamiento, lo que presumiblemente es ordenado y ordenado.
Pero ... Si los metadatos (longitud de la cadena) se almacenan por separado de los datos de la cadena real (tal vez en una tabla maestra), entonces restringir la longitud de los datos de la cadena en un byte, solo porque es más fácil almacenar solo un entero de 1 byte de metadatos parece un poco extraño.
En ambos casos, parecería ser una sutileza que probablemente depende de la implementación de la base de datos. La práctica de usar 255 parece bastante generalizada, por lo que alguien en algún lugar debe haber argumentado un buen caso al principio, ¿alguien puede recordar cuál fue / es ese caso? Los programadores no adoptarán ninguna práctica nueva sin una razón, y esto debe haber sido nuevo una vez.
fuente
Respuestas:
Con una longitud máxima de 255 caracteres, el DBMS puede elegir usar un solo byte para indicar la longitud de los datos en el campo. Si el límite fuera 256 o más, se necesitarían dos bytes.
Un valor de longitud cero es ciertamente válido para
varchar
datos (a menos que se restrinja de otra manera). La mayoría de los sistemas tratan una cadena vacía como distinta de NULL, pero algunos sistemas (especialmente Oracle) tratan una cadena vacía de manera idéntica a NULL. Para sistemas donde una cadena vacía no es NULL, se necesitaría un bit adicional en algún lugar de la fila para indicar si el valor debe considerarse NULL o no.Como observa, esta es una optimización histórica y probablemente no sea relevante para la mayoría de los sistemas actuales.
fuente
varchar(0)
. Probablemente no sea tan útil porque el valor solo podría ser dos cosas, la cadena vacía o NULL, por lo que también podría usar unbit
para eso.255 era el límite de varchar en mySQL4 y versiones anteriores.
También 255 caracteres + terminador nulo = 256
O el descriptor de longitud de 1 byte da un rango posible de 0-255 caracteres
fuente
char foo[256]
es importante porque a la administración de la memoria le gustan las potencias de 2. ver: stackoverflow.com/questions/3190146/… La asignaciónchar foo[257]
fragmentará la memoria o ocupará 512 bytes.255 es el valor numérico más grande que se puede almacenar en un entero sin signo de un solo byte (suponiendo bytes de 8 bits); por lo tanto, las aplicaciones que almacenan la longitud de una cadena para algún propósito preferirían 255 sobre 256 porque significa que solo tienen que asignar 1 byte para la variable "tamaño".
fuente
Del manual de MySQL:
Comprender y hacer una elección.
fuente
M represents the declared column length in characters for nonbinary string types and bytes for binary string types. L represents the actual length in bytes of a given string value.
dev.mysql.com/doc/refman/5.7/en/storage-requirements.html255 es el valor máximo de un entero de 8 bits: 11111111 = 255.
fuente
Una longitud máxima de 255 permite que el motor de la base de datos use solo 1 byte para almacenar la longitud de cada campo. Tiene razón en que 1 byte de espacio le permite almacenar 2 ^ 8 = 256 valores distintos para la longitud de la cadena.
Pero si permite que el campo almacene cadenas de texto de longitud cero, debe poder almacenar cero en la longitud. Por lo tanto, puede permitir 256 valores de longitud distintos, comenzando en cero: 0-255.
fuente
A menudo, los varchars se implementan como cadenas pascales: manteniendo la longitud real en el byte # 0. Por lo tanto, la longitud estaba vinculada a 255. (El valor de un byte varía de 0 a 255).
fuente
<<
Recordando los fundamentos del almacenamiento de bits / bytes, requiere un byte para almacenar enteros por debajo de 256 y dos bytes para cualquier número entero entre 256 y 65536. Por lo tanto, requiere el mismo espacio (dos bytes) para almacenar 511 o 512 o, para el caso, 65535 .... Por lo tanto, está claro que el argumento mencionado en la discusión anterior es N / A para varchar (512) o varchar (511).
fuente
8 bits sin signo = 256 bytes
255 caracteres + byte 0 para longitud
fuente
Solía ser que todas las cadenas requerían un terminador NUL o "barra invertida cero". Las bases de datos actualizadas no tienen eso. Eran "255 caracteres de texto" con un "\ 0" agregado automáticamente al final para que el sistema supiera dónde terminaba la cadena. Si dijiste VARCHAR (256), terminaría siendo 257 y luego estarías en el siguiente registro para un personaje. Antieconómico. Es por eso que todo fue VARCHAR (255) y VARCHAR (31). Por costumbre, el 255 parece haberse quedado pero los 31 se convirtieron en 32 y los 511 se convirtieron en 512. Esa parte es rara. Es difícil obligarme a escribir VARCHAR (256).
fuente
Creo que esto podría responder a tu pregunta. Parece que era el límite máximo de varchar en sistemas anteriores. Lo quité de otra pregunta de stackoverflow.
¿Existen desventajas al usar un varchar genérico (255) para todos los campos basados en texto?
fuente
Los datos se guardan en la memoria del sistema binario y 0 y 1 son dígitos binarios. El número binario más grande que puede caber en 1 byte (8 bits) es 11111111, que se convierte en decimal 255.
fuente