Por que historicamente as pessoas usam 255 e 256 para magnitudes de campos de banco de dados?

188

Você costuma ver os campos do banco de dados configurados com uma magnitude de 255 caracteres. Qual é o motivo tradicional / histórico? Suponho que tenha algo a ver com limites de paginação / memória e desempenho, mas a distinção entre 255 e 256 sempre me confundiu.

varchar(255)

Considerando que essa é uma capacidade ou magnitude, não um indexador , por que 255 é preferível a 256? Um byte está reservado para alguma finalidade (terminator ou null ou algo assim)?

Presumivelmente, varchar (0) é um absurdo (tem capacidade zero)? Nesse caso, 2 ^ 8 de espaço deve ser 256, com certeza?

Existem outras magnitudes que fornecem benefícios de desempenho? Por exemplo, varchar (512) tem menos desempenho que varchar (511) ou varchar (510)?

Esse valor é o mesmo para todos os bancos de dados de relações, antigos e novos?

isenção de responsabilidade - como desenvolvedor não sou DBA, uso tamanhos e tipos de campos adequados à minha lógica de negócios onde isso é conhecido, mas gostaria de saber o motivo histórico dessa preferência, mesmo que não seja mais relevante (mas até mais se ainda for relevante).

Editar:

Obrigado pelas respostas, parece haver algum consenso de que um byte é usado para armazenar tamanho, mas isso não resolve definitivamente o problema em minha mente.

Se os metadados (comprimento da string) forem armazenados na mesma memória / disco contíguo, faz algum sentido. 1 byte de metadados e 255 bytes de dados de string se encaixariam muito bem e se encaixariam em 256 bytes contíguos de armazenamento, que presumivelmente são limpos e arrumados.

Mas ... Se os metadados (comprimento da string) forem armazenados separadamente dos dados reais da string (talvez em uma tabela mestre), para restringir o comprimento dos dados da string por um byte, apenas porque é mais fácil armazenar apenas um número inteiro de 1 byte de metadados parece um pouco estranho.

Nos dois casos, parece ser uma sutileza que provavelmente depende da implementação do banco de dados. A prática de usar 255 parece bastante difundida; portanto, alguém em algum lugar deve ter argumentado um bom argumento para isso no início. Alguém pode se lembrar de qual era esse caso? Os programadores não adotam nenhuma nova prática sem uma razão, e isso deve ter sido novo uma vez.

Andrew M
fonte
3
Porque a contagem de caracteres começa de 0 a N-1. Portanto, 256 caracteres serão declarados varchar (255). A menos que eu esteja enganado.
Buhake Sindi
3
Talvez porque o pessoal de TI comece a contar com 0, não 1;)?
Romain Linsolas
Eu acho que tem a ver com os programadores da velha escola, nem consigo me lembrar por que fizemos isso.
Grumpy
7
@Elite Gentleman: não, o número entre parênteses é o comprimento verdadeiro ... Como nas declarações da matriz C: x [256] fornece x [0] ... x [255].
RedPandaCurios
@romaintaz - mas considere uma matriz que pode armazenar 1 item. Você declara algo [1] e acessa algo [0]. A questão é por que, no SQL, declaramos que a capacidade é de 1 byte a menos do que parece lógico à primeira vista.
Andrew M

Respostas:

167

Com um comprimento máximo de 255 caracteres, o DBMS pode optar por usar um único byte para indicar o comprimento dos dados no campo. Se o limite fosse de 256 ou superior, seriam necessários dois bytes.

Um valor de comprimento zero certamente é válido para varchardados (a menos que seja restrito de outra forma). A maioria dos sistemas trata uma string vazia como distinta de NULL, mas alguns sistemas (principalmente o Oracle) tratam uma string vazia de forma idêntica a NULL. Para sistemas em que uma cadeia vazia não é NULL, seria necessário um bit adicional em algum lugar da linha para indicar se o valor deve ser considerado NULL ou não.

Como você observa, essa é uma otimização histórica e provavelmente não é relevante para a maioria dos sistemas atualmente.

Greg Hewgill
fonte
Reservar um byte para o comprimento faz sentido, mas WRT seu segundo parágrafo, presumivelmente um / value / of length zero é válido, mas é / / capacity / of length zero válido?
Andrew M
1
@ Andrew: Eu apenas tentei e o PostgreSQL rejeita varchar(0). Provavelmente não é tão útil porque o valor pode ser apenas duas coisas, a sequência vazia ou NULL, e você pode usar apenas um bitpara isso.
Greg Hewgill
Portanto, é verdade supor que os metadados da capacidade sejam armazenados no mesmo bloco contíguo que os próprios dados e, portanto, há uma vantagem para o banco de dados manter o total dessas duas coisas (dados e metadados) em uma página (presumivelmente bytes)?
Andrew M
@ Andrew: Essa é uma suposição que pode ou não ser verdadeira, dependendo dos detalhes de implementação do DBMS em questão. Os tamanhos das páginas geralmente são muito maiores que 256 bytes. Como mencionei, esse tipo de otimização às vezes é importante (por exemplo, se você estiver armazenando bilhões de pequenas linhas), mas na maioria das vezes não vale a pena se preocupar.
Greg Hewgill
3
A importância no espaço em disco (e no espaço do índice) não ocorre porque 256 pode caber em uma página, mas porque 1 byte vs 2 bytes (para milhões / bilhões / trilhões de linhas) faz uma grande diferença.
precisa saber é o seguinte
35

255 era o limite varchar no mySQL4 e versões anteriores.

Também 255 caracteres + terminador nulo = 256

Ou o descritor de comprimento de 1 byte fornece um intervalo possível de 0 a 255 caracteres

RedPandaCurios
fonte
E a leitura char foo[256]é importante porque o gerenciamento de memória gosta de 2. poderes. Consulte: stackoverflow.com/questions/3190146/… A alocação char foo[257]fragmentará a memória ou ocupará 512 bytes.
ebyrob
4
O varchar não armazena o comprimento da string e, portanto, não precisa de um terminador nulo?
Cruncher
19

255 é o maior valor numérico que pode ser armazenado em um número inteiro não assinado de byte único (assumindo bytes de 8 bits) - portanto, aplicativos que armazenam o comprimento de uma string para algum propósito preferem 255 a 256, porque significa que eles precisam apenas aloque 1 byte para a variável "size".

Âmbar
fonte
17

No Manual do MySQL:

Tipo de Dados:
VARCHAR (M), VARBINARY (M)

Armazenamento Necessário:
L + 1 bytes se os valores da coluna exigirem de 0 a 255 bytes, L + 2 bytes se os valores exigirem mais de 255 bytes

Entenda e faça a escolha.

Anil Shinde
fonte
Sim, mas 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 é o valor máximo de um número inteiro de 8 bits: 11111111 = 255.

remi bourgarel
fonte
7

Um comprimento máximo de 255 permite que o mecanismo de banco de dados use apenas 1 byte para armazenar o comprimento de cada campo. Você está certo de que 1 byte de espaço permite armazenar 2 ^ 8 = 256 valores distintos para o comprimento da string.

Mas se você permitir que o campo armazene cadeias de texto com comprimento zero, será necessário armazenar zero no comprimento. Assim, você pode permitir 256 valores de comprimento distintos, começando em zero: 0-255.

MarkJ
fonte
6

Geralmente, os varchars são implementados como seqüências pascal: mantendo o comprimento real no byte # 0. Portanto, o comprimento foi vinculado a 255. (O valor de um byte varia de 0 a 255.)

Vlad
fonte
5

<<

Lembrando os fundamentos do armazenamento de bits / bytes, é necessário um byte para armazenar números inteiros abaixo de 256 e dois bytes para qualquer número inteiro entre 256 e 65536. Portanto, requer o mesmo espaço (dois bytes) para armazenar 511 ou 512 ou, nesse caso, 65535 .... Assim, fica claro que o argumento mencionado na discussão acima é N / A para varchar (512) ou varchar (511).

Balaji Katika
fonte
4

8 bits não assinados = 256 bytes

255 caracteres + byte 0 para comprimento

gbn
fonte
3

Costumava ser que todas as strings exigissem um terminador NUL, ou "barra invertida-zero". Bancos de dados atualizados não têm isso. Havia "255 caracteres de texto" com um "\ 0" adicionado automaticamente no final, para que o sistema soubesse onde a sequência terminava. Se você dissesse VARCHAR (256), ele acabaria sendo 257 e você estaria no próximo registro de um caractere. Desperdício. É por isso que tudo foi VARCHAR (255) e VARCHAR (31). Por hábito, os 255 parecem ter permanecido por aí, mas os anos 31 se tornaram 32 e os 511 se tornaram 512. Essa parte é estranha. É difícil me fazer escrever VARCHAR (256).

Greg
fonte
0

Eu acho que isso pode responder à sua pergunta. Parece que era o limite máximo de varchar em sistemas anteriores. Tirei-o de outra pergunta sobre o stackoverflow.

É difícil saber qual é o endereço postal mais longo, é claro, e é por isso que muitas pessoas escolhem um VARCHAR longo que certamente é mais longo do que qualquer endereço. E 255 é habitual, porque pode ter sido a duração máxima de um VARCHAR em alguns bancos de dados no início dos tempos (assim como no PostgreSQL até mais recentemente).

Há desvantagens em usar um varchar genérico (255) para todos os campos baseados em texto?

Neo M Hacker
fonte
0

Os dados são salvos na memória no sistema binário e 0 e 1 são dígitos binários. O maior número binário que pode caber em 1 byte (8 bits) é 11111111, que converte em decimal 255.

Ejaz
fonte