sql - una - ¿Por qué históricamente las personas usan 255 o 256 para las magnitudes de campo de la base de datos?
sql server sintaxis (13)
<<
Recuperado los fundamentos del almacenamiento de bits / bytes, requiere un byte para almacenar enteros por debajo de 256 y dos bytes para cualquier entero entre 256 y 65536. Por lo tanto, requiere el mismo espacio (dos bytes) para almacenar 511 o 512 o para ese asunto 65535 ... Por lo tanto, está claro que el argumento mencionado en la discusión anterior es N / A para varchar (512) o varchar (511).
A menudo ve campos de base de datos configurados para tener una magnitud de 255 caracteres, ¿cuál es la razón tradicional / histórica por qué? Supongo que tiene algo 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 a más de 256? ¿Es un byte reservado para algún propósito (terminador o nulo o algo así)?
Presumiblemente varchar (0) es una tontería (tiene capacidad cero)? En cuyo caso 2 ^ 8 de espacio debería ser 256 seguramente?
¿Hay otras magnitudes que proporcionan beneficios de rendimiento? Por ejemplo, ¿varchar (512) es menos eficiente que varchar (511) o varchar (510)?
¿Este valor es el mismo para todas las bases de datos de relaciones, antiguas y nuevas?
Descargo de responsabilidad : soy desarrollador, no soy administrador de bases de datos, utilizo tamaños de campo y tipos que se adaptan a mi lógica comercial, pero me gustaría saber la razón histórica de esta preferencia, incluso si ya no es relevante (pero incluso más si todavía 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 soluciona definitivamente el problema en mi mente.
Si los metadatos (longitud de cadena) se almacenan en la misma memoria / disco contiguos, tiene sentido. 1 byte de metadatos y 255 bytes de datos de cadena, se adaptarían muy bien y encajarían en 256 bytes contiguos de almacenamiento, lo que presumiblemente es limpio y ordenado.
Pero ... si los metadatos (longitud de cadena) se almacenan por separado de los datos de cadena reales (quizás en una tabla maestra), para limitar la longitud de los datos de cadena por un byte, simplemente porque es más fácil almacenar solo un entero de 1 byte de los metadatos parece un poco extraño.
En ambos casos, parecería ser una sutileza que probablemente dependa de la implementación de DB. La práctica de usar 255 parece bastante extendida, por lo que alguien en algún lugar debe haber argumentado un buen caso al principio, ¿alguien puede recordar qué era ese caso? Los programadores no adoptarán ninguna práctica nueva sin una razón, y esto debe haber sido nuevo una vez.
255 era el límite varchar en mySQL4 y anterior.
También 255 caracteres + terminador nulo = 256
O el descriptor de 1 byte de longitud da un rango posible de 0-255 caracteres
255 es el mayor valor numérico que puede almacenarse 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 asigna 1 byte para la variable "tamaño".
255 es el valor máximo de un entero de 8 bits: 11111111 = 255.
8 bits sin signo = 256 bytes
255 caracteres + byte 0 para la longitud
A menudo varchars se implementan como cadenas pascal: manteniendo la longitud real en el byte # 0. Por lo tanto, la longitud se limitó a 255. (El valor de un byte varía de 0 a 255).
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 mayor, se necesitarían dos bytes.
Un valor de longitud cero es ciertamente válido para datos varchar
(a menos que se limite 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 forma 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 nota, esta es una optimización histórica y probablemente no sea relevante para la mayoría de los sistemas actuales.
Creo que esto podría responder tu pregunta. Parece que era el límite máximo de varchar en sistemas anteriores. Lo quité de otra pregunta de .
Es difícil saber cuál es la dirección postal más larga, por supuesto, y es por eso que muchas personas eligen un VARCHAR largo que es ciertamente más largo que cualquier dirección. Y 255 es habitual porque puede haber sido la longitud máxima de un VARCHAR en algunas bases de datos al comienzo de los tiempos (y también en PostgreSQL hasta hace poco).
¿Hay desventajas al usar un varchar genérico (255) para todos los campos basados en texto?
Creo que tiene que ver con los programadores de la vieja escuela, ni siquiera puedo recordar por qué lo hicimos.
De MySQL Manual:
Tipo de datos :
VARCHAR (M), VARBINARIO (M)Almacenamiento requerido:
L + 1 bytes si los valores de columna requieren 0 - 255 bytes, L + 2 bytes si los valores pueden requerir más de 255 bytes
Comprende y elige.
Los datos se guardan en la memoria en el 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 255 decimales.
Solía ser que todas las cadenas requerían un terminador NUL, o "backslash-zero". Las bases de datos actualizadas no tienen eso. Era "255 caracteres de texto" con un "/ 0" añadido automáticamente al final para que el sistema supiera dónde terminaba la secuencia. Si dijeras 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 extraña. Es difícil hacerme escribir VARCHAR (256).
Una longitud máxima de 255 permite que el motor de 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. De modo que puede permitir 256 valores de longitud distintos, comenzando en cero: 0-255.