Existe uma boa razão para eu ver o VARCHAR (255) usado com tanta frequência (em oposição a outro comprimento)?

158

Em vários cursos, livros e trabalhos, vi campos de texto definidos como VARCHAR (255) como o tipo padrão de texto "abreviado". Existe alguma boa razão para que um comprimento de 255 seja escolhido com tanta frequência, além de ser um bom número redondo ? É um empecilho de algum tempo no passado em que havia uma boa razão (se aplica ou não hoje)?

Percebo, é claro, que um limite mais apertado seria mais ideal, se você souber de alguma forma o comprimento máximo da corda. Mas se você estiver usando VARCHAR (255), isso provavelmente indica que você não conhece o comprimento máximo, apenas que é uma string "abreviada".


Nota: Encontrei esta pergunta ( varchar (255) v tinyblob v tinytext ), que diz que VARCHAR ( n ) requer n +1 bytes de armazenamento para n <= 255, n +2 bytes de armazenamento para n > 255. Essa é a única razão? Isso parece meio arbitrário, já que você salvaria apenas dois bytes em comparação com o VARCHAR (256), e também poderia salvar facilmente outros dois bytes declarando-o como VARCHAR (253).

Kip
fonte

Respostas:

109

Historicamente, 255 caracteres geralmente têm o comprimento máximo de a VARCHARem alguns DBMSes e, às vezes, ainda acabam sendo o máximo efetivo se você deseja usar o UTF-8 e a coluna indexada (devido às limitações de tamanho do índice).

caos
fonte
4
@CharlesBretana: se você ler o restante da frase que citou, encontrará a explicação exata que está solicitando.
caos
2
@CharlesBretana: Por "falso UTF-8", quero dizer a codificação "utf8" do MySQL, que, como mencionei, reserva (e é limitada a) 3 bytes por caractere. Esta não é uma versão muito boa do UTF-8; Se você quiser UTF-8 decente no MySQL, precisará usar a codificação "utf8mb4". Mas é muito mais provável que as pessoas não saibam disso e sigam o "utf8", e muito mais provável que desejem UTF-8 do que qualquer outra codificação; portanto, prontamente, elas acabam com um comprimento indexável máximo de 255 caracteres em um VARCHAR. Não obstante, sua surpresa.
caos
3
@CharlesBretana: Eu já expliquei isso três vezes e nada mudou. O limite de tamanho do índice do MySQL ainda é de 767 bytes, o número de bytes necessários para codificar um caractere UTF-8 de 3 bytes ainda é 3, e o piso (767/3) ainda é 255. Sua determinação em encontrar algo a ser confundido sobre a crença dos mendigos .
caos
1
@CharlesBretana (Desculpe por estar atrasado para toda essa festa) Eu não sou especialista em DB, mas acho que o que o caos está dizendo é: sim, uma coluna 'Fake UTF-8' pode ter mais de 255 caracteres, mas o índice será trabalhe apenas nos primeiros 255 caracteres do varchar, tornando-o efetivamente o máximo de uma coluna se você desejar que ele seja totalmente indexado. Agora isso é apenas o que eu entendi das explicações dele, posso estar errado, não sou especialista em índices SQL.
Francis Lord
2
@CharlesBretana Se você olhar corretamente para a resposta do Caos, notará que ela se separou em duas partes: 1. O motivo histórico por trás do Varchar (255) é tão comum (costumava ser o máximo em alguns DBMS mais antigos), 2. Ainda hoje, ainda é uma limitação para alguns, devido às limitações do índice discutidas anteriormente, as Partes 1 e 2 não estão vinculadas. A Parte 1 é a resposta real à pergunta, a Parte 2 é uma nota lateral que ainda é relevante para a pergunta porque explica por que ainda hoje ainda pode ser uma limitação. (CONTINUAÇÃO ->)
Francis Lord
161

255 é usado porque é o maior número de caracteres que pode ser contado com um número de 8 bits. Ele maximiza o uso da contagem de 8 bits, sem exigir frivolamente outro byte inteiro para contar os caracteres acima de 255.

Quando usado dessa maneira, o VarChar usa apenas o número de bytes + 1 para armazenar seu texto; portanto, você pode configurá-lo para 255, a menos que queira um limite rígido (como 50) no número de caracteres no campo.

Robert Harvey
fonte
90
Eu gosto dessa frase: "exigindo frivolamente outro byte inteiro". =)
MusiGenesis
7
Isso vale para DBs em que os varchars são UTF-8?
antak
1
@antak: No MySQL, usando o InnoDB, qualquer coluna de chave não pode ser maior que 767 bytes. Se uma coluna VARCHAR for UTF8 (o que significa que cada caractere pode levar até 3 bytes), o comprimento máximo permitido da coluna será floor (767/3) = 255. Estou assumindo que "767" foi escolhido exatamente por esse motivo.
BlueRaja - Danny Pflughoeft
1
Se o conjunto de caracteres forutf8 , varchar(85)é o limite sobre o qual a passagem ultrapassa o byte de comprimento de um a dois bytes. Se é utf8mb4, é varchar(63). Elas são significativas porque são o máximo para o qual o comprimento de um VARCHAR pode ser estendido através do uso da ALTER TABLE online . Conseqüentemente, derivei esses números criando uma tabela com uma varchar(2) charset utf8coluna e vendo até onde consegui estendê-la ALGORITHM=INPLACE.
precisa saber é
Faz ainda mais sentido quando você considera que muitos "bancos de dados" Back In The Day foram armazenados em fita magnética. Era muito comum ler dados em "blocos" dimensionados em múltiplos de dois. Dessa forma, os dados foram armazenados com mais eficiência (e quando você executava em um mainframe antigo, pequenas eficiências como essas eram otimizações de fazer ou quebrar).
TMN
23

Provavelmente porque o SQL Server e o Sybase (para citar dois que eu conheço) costumavam ter um máximo de 255 caracteres no número de caracteres em uma VARCHARcoluna. Para o SQL Server, isso mudou na versão 7 em 1996/1997 ou mais ... mas os hábitos antigos às vezes são difíceis.

Charles Bretana
fonte
8
+1 por citar bancos de dados e versões específicos. E "velhos hábitos morrem com dificuldade" é provavelmente a resposta mais verdadeira de todas.
Andrew M
17

Vou responder à pergunta literal: não , não há uma boa razão para você ver o VARCHAR (255) usado com tanta frequência (existem de fato razões , conforme discutido nas outras respostas, mas não boas). Você não encontrará muitos exemplos de projetos que falharam catastroficamente porque o arquiteto escolheu VARCHAR (300) em vez de VARCHAR (255). Isso seria uma questão de insignificância quase total, mesmo se você estivesse falando sobre CHAR em vez de VARCHAR.

MusiGenesis
fonte
1 byte de 255 é 0.4%. Às vezes você se importa com a última metade de um por cento mais ou menos. Às vezes você não. Se os custos de hospedagem e desempenho custam dezenas de dólares, provavelmente você não se importa. Se eles chegam a milhões, provavelmente o fazem.
Edward Brey 14/10
2
@ EdwardBrey: se a Lei de Moore ainda é verdadeira, minha resposta aqui é 16 vezes mais válida do que era quando eu a escrevi.
MusiGenesis 17/10
A menos que tenhamos descoberto 16 vezes mais maneiras em que os computadores podem nos ajudar. A velocidade ainda é um recurso.
Edward Brey
14

Quando você diz 2^8que recebe 256, mas os números em termos de computadores começam a partir do número 0. Então, você tem o 255, você pode sondá-lo em uma máscara da Internet para o IP ou no próprio IP.

255 é o valor máximo de um número inteiro de 8 bits: 11111111 = 255

Isso ajuda?

exec.-
fonte
1
Com números inteiros, você conta a partir de 0 e termina em 255. Mas, com locais em uma string, conta a partir do 1º lugar, portanto, não faz sentido terminar no 256º lugar, porque você começou em 1 em vez de 0? Ainda não estou de acordo com o varchar (256), devido aos resultados de string_length (), mas não tenho muita certeza.
HoldOffHunger 16/03
1
As strings @HoldOffHunger em um banco de dados podem ter um comprimento de zero caracteres; portanto, o intervalo permitido de comprimentos quando o comprimento é armazenado em oito bits fica entre 0 e 255. Se você quiser dizer que todas as strings devem ter pelo menos um caractere, você poderia suportar cadeias de caracteres de 256 caracteres com um comprimento de oito bits.
Phoog
7

Nota: Encontrei esta pergunta ( varchar (255) v tinyblob v tinytext ), que diz que VARCHAR ( n ) requer n +1 bytes de armazenamento para n <= 255, n +2 bytes de armazenamento para n > 255. Essa é a única razão? Isso parece meio arbitrário, já que você salvaria apenas dois bytes em comparação com o VARCHAR (256), e também poderia salvar facilmente outros dois bytes declarando-o como VARCHAR (253).

Não. Você não salva dois bytes declarando 253. A implementação do varchar provavelmente é um contador de comprimento e uma matriz não terminada de comprimento variável. Isso significa que se você armazenar "olá" em um varchar (255), ocupará 6 bytes: um byte para o comprimento (o número 5) e 5 bytes para as cinco letras.

Stefano Borini
fonte
3
Esta afirmação não é verdadeira para todos os bancos de dados. muitos bancos de dados usam campos varchar do tamanho especificado nas tabelas para que eles não precisem mover linhas quando esse campo for alterado para uma linha.
SingleNegationElimination
sim você está certo. depende da implementação. Você precisa verificar o manual do fornecedor para ver o que é o caso.
Stefano Borini
2
Pode ser permitido, mas implementar VARCHARdessa maneira anula todo o ponto de usar em VARCHARvez de CHAR.
dan04
4

Um número de 1 byte não assinado pode conter o intervalo [0-255], inclusive. Então, quando você vê 255, é principalmente porque os programadores pensam na base 10(entendeu a piada?) :)

Na verdade, por um tempo, 255 foi o maior tamanho que você poderia dar a um VARCHAR no MySQL, e há vantagens em usar o VARCHAR sobre o TEXTO com indexação e outros problemas.

gahooa
fonte
4

Em muitos aplicativos, como o MsOffice (até a versão 2000 ou 2002), o número máximo de caracteres por célula era 255. Mover dados de programas capazes de manipular mais de 255 caracteres por campo para / desses aplicativos foi um pesadelo. Atualmente, o limite é cada vez menos difícil.

Joaquin Montes
fonte
2

0000 0000 -> este é um número binário de 8 bits. Um dígito representa um pouco.

Você conta assim:

0000 0000 → (0)

0000 0001 → (1)

0000 0010 → (2)

0000 0011 → (3)

Cada bit pode ter um de dois valores: ativado ou desativado. O número mais alto total pode ser representado pela multiplicação:

2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 - 1 = 255

Ou

2^8 - 1. 

Subtraímos um porque o primeiro número é 0.

255 pode conter um pouco (sem trocadilhos) de valores.

À medida que usamos mais bits, o valor máximo aumenta exponencialmente. Portanto, para muitos propósitos, adicionar mais bits é um exagero.

ScottyBlades
fonte
1

Outro motivo pode ser o fato de que em bibliotecas de acesso a dados muito antigas no Windows, como RDO e ADO (versão COM não ADO.NET), era necessário chamar um método especial, GetChunk, para obter dados de uma coluna com mais de 255 caracteres. Se você limitou uma coluna varchar a 255, esse código extra não era necessário.

Booji Boy
fonte