Usar VARCHAR(255) para todos os campos ou ficar escolhendo o melhor tamanho para cada campo? [duplicada] – mysql sqlbanco-de-dados banco-de-dados

Pergunta:


Esta pergunta já tem uma resposta aqui:

Supondo os seguintes campos (por exemplo): Nome, Rua, Cidade ,UF.

O Nome seria o nome do cliente. Existem pessoas com 2 nomes curtos ou pessoas com 5 ou mais nomes, logo, é possível ter um “João Silva” ou uma “Maria Clara Ramos Santos da Silva”, ou seja, pessoas com 10 caracteres e pessoas com 27 caracteres (ou até mais).

O Rua seria o nome da rua do cliente: O mesmo caso do exemplo anterior.

O Cidade seria a cidade do cliente: O mesmo caso do exemplo anterior.

O UF seria o estado do cliente: Como eu gostaria apenas da Sigla, não vai ter estado com 5 ou mais letras, apenas 2.

É valido colocar VARCHAR(255) para tudo ou é melhor ficar escolhendo qual o melhor tamanho para cada campo? Quando digo “melhor”, estou me referindo em não gastar espaço desnecessário, tipo ter um campo de 255 caracteres e só armazenar valores com apenas 2 letras (UF). Li em outras respostas que o VARCHAR() é um formato dinâmico, o valor passado entre os parênteses é apenas o valor máximo que aquele campo vai suportar, isso é verdade? Se for, quer dizer então que é valido colocar VARCHAR(255) para todos os campos, já que o valor vai ser dinâmico com o máximo de 255, logo, o máximo é 255, porém vai ter apenas 2 letras então vai armazenar apenas o espaço necessário para 2 letras e não para 255.

“Ficar escolhendo melhor tamanho” = Nome VARCHAR(100), Rua VARCHAR(120), Cidade VARCHAR(100), UF VARCHAR(2).

Tive essa duvida porque estou pra criar um banco para um sistema no MySQL, mas minha duvida se refere a banco de dados em geral, não apenas exclusivamente ao MySQL.

Autor da pergunta D. Watson

Maniero

Ao contrário do que está imaginando VARCHAR não quer dizer que terá 255 caracteres. Ele ocupará essencialmente a quantidade necessária. Não será a mesma quantidade de bytes porque a codificação pode ter caracteres com mais de um byte e tem alguns bytes de controle.

O CHAR ocupa o tamanho que você definir. E não tem custo adicional de controle. O estado seria CHAR(2). Eu o prefiro sempre que os dados tem tamanho conhecido.

Eu uso o VARCHAR com um número do máximo de caracteres que aquela coluna pode ter. Apesar de eu garantir na aplicação que o tamanho máximo será respeitado sempre, é bom ter um gatilho se escapar algum erro de programação. Um nome eu usaria 60 ou algo assim, não porque gasta mais colocar 255, apenas porque não vejo vantagem alguma nisso e tem pelo menos uma desvantagem. Então válido é, bom não.

Alguns bancos de dados podem ser ligeiramente diferente, mas vale mais ou menos o mesmo.

Se estiver com preguiça de pensar no número mais adequado aí meu conselho é procurar outra profissão 🙂

Se está em outras respostas e elas tem vários votos, é de um usuário experiente, é quase 100% certo que seja verdade.

Esta resposta é específica para SQL Server.

Na documentação do SQL Server para o tipo de dados varchar(n) consta que “O tamanho do armazenamento é o tamanho real dos dados inseridos + 2 bytes”. Ou seja, se em determinada linha o tamanho do string a ser armazenado na coluna é de 12 bytes, independente da coluna ser declarada como varchar(20) ou varchar(8000) no banco de dados aquela informação ocupará 14 bytes. Supondo uma coluna cujo conteúdo tenha no máximo 60 caracteres, então tanto faria declarar varchar(60) ou varchar(255).

Entretanto, quando o otimizador de consultas do SQL Server gera o plano de execução de consulta, e no mesmo ocorrem determinadas ações, é necessário estimar o quanto de memória deverá ser alocada previamente para a execução da consulta – memory grant -, e um dos parâmetros para esse cálculo é o tamanho da linha. No caso de linhas em que há colunas de tamanho variável, o gerenciador não mantém informações sobre qual é o tamanho médio das informações gravadas na coluna e utiliza então valor arbitrário, definido a partir do tamanho máximo que a coluna permite. Por exemplo, no caso de uma coluna declarada como varchar(255), o otimizador de consultas considera a metade mais 2 bytes, 128 + 2, como o valor a ser utilizado no cálculo do tamanho estimado da linha, em memória. Ou seja, irá alocar 130 bytes mesmo que o tamanho da coluna possa ter no máximo 60 caracteres. Aqui já se percebe que será alocada mais memória do que o necessário.

Então, no caso de SQL Server declare sempre o tamanho correto; não superestime.

Além do memory grant dos planos de execução de determinadas consultas há outras situações em que superestimar o tamanho das colunas de tamanho variável traz desvantagens. No artigo Como definir o tamanho máximo de colunas de tamanho variável? há explicação detalhada do impacto negativo em superestimar o tamanho de colunas de tamanho variável, inclusive com imagens dos planos de execução.

Para campos em que se tem uma noção óbvia do tanto de caracteres que vai receber, é bom utilizar o CHAR(numero de caracteres), mas antes, verifique o tipo de caractere que será recebido, se é do tipo inteiro, texto, data, entre outros. Além disso, é bom prestar atenção nestes detalhes e assim você irá poupar bytes em seu SGBD e em suas Databases (Schemas).

observações:

  • CHAR ocupa todo o número de caractere escolhido;
  • VARCHAR ocupa somente os caracteres inseridos, eliminando a quantidade que ficar vaga, porém ocupa alguns bytes devido esta quantia ficar vaga.

Fonte

Related Posts:

Qual a diferença entre AppCompatActivity e Activity? – android android-activity
Pergunta: Qual a diferença da AppCompatActivity para Activity ? A partir de qual versão a AppCompatActivity foi adicionada ao Android? Autor da pergunta Luhhh A diferença reside ...
Como abreviar palavras em PHP? – php string
Pergunta: Possuo informações comuns como nome de pessoas e endereços, e preciso que elas contenham no máximo 30 caracteres sem cortar palavras. Exemplo: 'Avenida Natalino João Brescansin' ...
Qual é a finalidade de um parêntese vazio numa declaração Lambda? – c# expressões-lambda característica-linguagem
Pergunta: Criei um exemplo de uma declaração Lambda sem argumentos, entretanto, estou com duvidas referente a omissão do parêntese vazio () na declaração. Veja o exemplo: class ...
Boas práticas para URI em API RESTful – api rest restful
Pergunta: Estou com dúvida em relação às URIs de alguns recursos da api que estou desenvolvendo. Tenho os recursos projetos e atividades com relação 1-N, ...
Dúvidas sobre a integração do MySQL com Java – java mysql netbeans
Pergunta: Estou criando um sistema no NetBeans, utilizando a linguagem Java e o banco de dados MySQL. Escrevi o seguinte código para realizar a conexão ...
Qual é a finalidade da pasta Model do framework Inphinit? – php inphinit
Pergunta: No Inphinit micro-framework existe a pasta Model que fica dentro da pasta application, e nela é onde ficam as classes, mas eu estou muito ...
Uso do ‘@’ em variáveis – javascript typescript coffeescript
Pergunta: Vejo em algumas linguagens que compilam para javascript, como TypeScript e CoffeeScript, o uso do @ em variáveis, como também, casos em que o ...
Qual tamanho máximo um arquivo JSON pode ter? – json arquivo
Pergunta: Vou dar um exemplo para conseguir explicar minha duvida: Preciso recuperar informação de imagens vindas de uma API, esse banco de imagens me retorna JSON's ...
O que é Teste de Regressão? – terminologia engenharia-de-software testes
Pergunta: Na matéria de Teste de Software o professor abordou um termo chamado Teste de Regressão, isto dentro da disciplina de teste de software. Sendo ...
O que é um construtor da linguagem? – php característica-linguagem
Pergunta: Em PHP, já li e ouvi várias vezes a respeito dos Construtores da Linguagem. Os casos que sempre ouvi falar deles foi em casos ...
Função intrínseca para converter numérico para string – cobol
Pergunta: Estou a tentar saber se existe alguma função intrínseca do COBOL para converter um data numérico para string sem precisar usar a cláusula REDEFINES: ( ...
Porque usar implements? – java android
Pergunta: Qual a diferença entre usar btn.setOnClickListener(new OnClickListener() { e public class MainActivity extends Activity implements OnClickListener{ Estive fazendo um curso de Android e meu professor falou que ...
O que é XHTML e quando deve ser usado? – html xml xhtml
Pergunta: O que eu sei é que o XHTML precisa ser XML válido. Isso implica, por exemplo, que todas as tags precisam ser fechadas. Por ...
Uma placa aceleradora de vídeo pode melhorar o desempenho não-gráfico? [fechada] – desempenho
Pergunta: Para desenvolver em Ruby on Rails, eu utilizo aqui uma máquina virtual do VirtualBox com Ubuntu Server 14.04 sem interface gráfica instalada. Recentemente descobri uma ...
Concat() VS Union() – c# .net
Pergunta: Qual a diferença entre Concat() e Union() ? Quando usar Concat() e quando usar Union() ? Somente pode ser usado em list ? ...

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *