¿Por qué históricamente la gente usa 255 no 256 para las magnitudes de campo de la base de datos?

190

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.

Andrew M
fuente
3
Porque el recuento de caracteres comienza de 0 a N-1. Entonces 256 caracteres serán declarados varchar (255). A menos que me equivoque.
Buhake Sindi
3
¿Quizás porque las personas de TI comienzan a contar con 0, no con 1;)?
Romain Linsolas
Creo que tiene que ver con los programadores de la vieja escuela, ni siquiera puedo recordar por qué lo hicimos.
Gruñón
77
@Elite Gentleman: no, el número entre paréntesis es la longitud verdadera ... Al igual que en las declaraciones de matriz C: x [256] da x [0] ... x [255].
RedPandaCurios
@romaintaz, pero considere una matriz que puede almacenar 1 elemento. Lo declaras algo [1] y accedes a él algo [0]. La pregunta es por qué en SQL declaramos que la capacidad es 1 byte menos de lo que parece lógico a primera vista.
Andrew M

Respuestas:

167

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.

Greg Hewgill
fuente
Reservar un byte para la longitud tiene sentido, pero WRT su segundo paragrifo, presumiblemente un / valor / de longitud cero es válido, pero ¿es válido / capacidad / de longitud cero?
Andrew M
1
@ Andrew: Acabo de intentarlo y PostgreSQL lo rechaza 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 un bitpara eso.
Greg Hewgill
Entonces, ¿es cierto suponer que los metadatos de capacidad se almacenan en el mismo bloque contiguo que los datos en sí mismos y, por lo tanto, la base de datos tiene la ventaja de mantener el total de esas dos cosas (datos y metadatos) dentro de una página (presumiblemente 256 bytes)?
Andrew M
@ Andrew: Esa es una suposición que puede o no ser cierta, dependiendo de los detalles de implementación del DBMS en cuestión. Los tamaños de página suelen ser mucho más grandes que 256 bytes. Como mencioné, este tipo de optimización a veces es importante (por ejemplo, si está almacenando miles de millones de pequeñas filas), pero la mayoría de las veces no vale la pena preocuparse.
Greg Hewgill
3
La importancia en el espacio en disco (y en el espacio de índice) no se debe a que 256 pueden caber en una página, sino a que 1 byte frente a 2 bytes (para millones / billones / trillones de filas) hace una gran diferencia.
ypercubeᵀᴹ
35

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

RojoPandaCurios
fuente
Y leer 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ón char foo[257]fragmentará la memoria o ocupará 512 bytes.
ebyrob
44
¿Varchar no almacena la longitud de la cadena y, por lo tanto, no necesita un terminador nulo?
Cruncher
19

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

Ámbar
fuente
17

Del manual de MySQL:

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

Comprender y hacer una elección.

Anil Shinde
fuente
Sí, pero 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.html
DLight
13

255 es el valor máximo de un entero de 8 bits: 11111111 = 255.

Remi Bourgarel
fuente
7

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.

MarkJ
fuente
6

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

Vlad
fuente
5

<<

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

Balaji Katika
fuente
4

8 bits sin signo = 256 bytes

255 caracteres + byte 0 para longitud

gbn
fuente
3

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

Greg
fuente
0

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.

Por supuesto, es difícil saber cuál es la dirección postal más larga, razón por la cual muchas personas eligen un VARCHAR largo que ciertamente es 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 en los albores del tiempo (así como PostgreSQL hasta más recientemente).

¿Existen desventajas al usar un varchar genérico (255) para todos los campos basados ​​en texto?

Neo M Hacker
fuente
0

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.

Ejaz
fuente