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:
-
Por que é muito utilizado Varchar(255)?
4 respostas
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:
-
CHARocupa todo o número de caractere escolhido; -
VARCHARocupa somente os caracteres inseridos, eliminando a quantidade que ficar vaga, porém ocupa alguns bytes devido esta quantia ficar vaga.



