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.
fonte
Respostas:
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
varchar
dados (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.
fonte
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 umbit
para isso.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
fonte
char foo[256]
é importante porque o gerenciamento de memória gosta de 2. poderes. Consulte: stackoverflow.com/questions/3190146/… A alocaçãochar foo[257]
fragmentará a memória ou ocupará 512 bytes.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".
fonte
No Manual do MySQL:
Entenda e faça a escolha.
fonte
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 é o valor máximo de um número inteiro de 8 bits: 11111111 = 255.
fonte
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.
fonte
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.)
fonte
<<
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).
fonte
8 bits não assinados = 256 bytes
255 caracteres + byte 0 para comprimento
fonte
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).
fonte
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.
Há desvantagens em usar um varchar genérico (255) para todos os campos baseados em texto?
fonte
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.
fonte