Qual é a diferença entre VARCHAR e CHAR no MySQL?
Estou tentando armazenar hashes MD5.
Qual é a diferença entre VARCHAR e CHAR no MySQL?
Estou tentando armazenar hashes MD5.
Respostas:
VARCHAR
é de tamanho variável.
CHAR
é um comprimento fixo.
Se o seu conteúdo for de tamanho fixo, você obterá melhor desempenho CHAR
.
Veja a página do MySQL em Tipos CHAR e VARCHAR para uma explicação detalhada (leia também os comentários).
Values in VARCHAR columns are variable-length strings. The length can be specified as a value from 0 to 255 before MySQL 5.0.3, and 0 to 65,535 in 5.0.3 and later versions.
CHAR Vs VARCHAR
CHAR é usado para variável de tamanho de comprimento fixo
VARCHAR é usado para variável de tamanho de comprimento variável.
Por exemplo
Create table temp
(City CHAR(10),
Street VARCHAR(10));
Insert into temp
values('Pune','Oxford');
select length(city), length(street) from temp;
A saída será
length(City) Length(street)
10 6
Conclusão: Para usar o espaço de armazenamento com eficiência, é necessário usar VARCHAR, em vez CHAR, se o comprimento variável for variável
Uma CHAR(x)
coluna pode ter apenas exatamente x
caracteres.
Uma VARCHAR(x)
coluna pode ter até x
caracteres.
Como seus hashes MD5 sempre terão o mesmo tamanho, você provavelmente deve usar a CHAR
.
No entanto, você não deve usar o MD5 em primeiro lugar; conhece fraquezas.
Use SHA2 em vez disso.
Se você estiver usando hash de senhas, use bcrypt.
Qual é a diferença entre VARCHAR e CHAR no MySQL?
Para respostas já dadas, gostaria de acrescentar que, em sistemas OLTP ou em sistemas com atualizações frequentes, considere o uso CHAR
mesmo para colunas de tamanho variável devido à possível VARCHAR
fragmentação de coluna durante as atualizações.
Estou tentando armazenar hashes MD5.
O hash MD5 não é a melhor opção se a segurança realmente importa. No entanto, se você usar qualquer função de hash, considere o BINARY
tipo para ela (por exemplo, o MD5 produzirá um hash de 16 bytes, portanto, BINARY(16)
seria suficiente em vez de CHAR(32)
32 caracteres que representam dígitos hexadecimais. Isso economizaria mais espaço e apresentaria desempenho eficiente.
Varchar corta espaços à direita se os caracteres inseridos forem menores que o comprimento declarado, enquanto char não. Char preencherá espaços e sempre será o comprimento do comprimento declarado. Em termos de eficiência, o varchar é mais hábil, pois apara os caracteres para permitir mais ajustes. No entanto, se você souber o tamanho exato do char, ele será executado com um pouco mais de velocidade.
Na maioria dos RDBMSs hoje, eles são sinônimos. No entanto, para os sistemas que ainda possuem distinção, um campo CHAR é armazenado como uma coluna de largura fixa. Se você defini-lo como CHAR (10), 10 caracteres serão gravados na tabela, em que "preenchimento" (normalmente espaços) é usado para preencher qualquer espaço que os dados não ocupam. Por exemplo, salvar "bob" seria salvo como ("bob" +7 espaços). Uma coluna VARCHAR (caractere variável) destina-se a armazenar dados sem desperdiçar o espaço extra que uma coluna CHAR ocupa.
Como sempre, a Wikipedia fala mais alto.
CHAR é um campo de comprimento fixo; VARCHAR é um campo de tamanho variável. Se você estiver armazenando seqüências de caracteres com um comprimento muito variável, como nomes, use um VARCHAR, se o comprimento for sempre o mesmo, use um CHAR porque é um pouco mais eficiente em tamanho e também um pouco mais rápido.
CHAR é comprimento fixo e VARCHAR é comprimento variável. O CHAR sempre usa a mesma quantidade de espaço de armazenamento por entrada, enquanto o VARCHAR usa apenas a quantidade necessária para armazenar o texto real.
O caractere é um tipo de dados de caracteres de tamanho fixo, o varchar é um tipo de dados de caracteres de comprimento variável.
Como char é um tipo de dados de tamanho fixo, o tamanho do armazenamento do valor char é igual ao tamanho máximo para esta coluna. Como varchar é um tipo de dados de comprimento variável, o tamanho de armazenamento do valor varchar é o comprimento real dos dados inseridos, não o tamanho máximo para esta coluna.
Você pode usar char quando se espera que as entradas de dados em uma coluna tenham o mesmo tamanho. Você pode usar varchar quando se espera que as entradas de dados em uma coluna variem consideravelmente em tamanho.
de acordo com o livro MySQL de alto desempenho :
O VARCHAR armazena cadeias de caracteres de tamanho variável e é o tipo de dados de cadeia mais comum. Pode exigir menos espaço de armazenamento do que os tipos de comprimento fixo, porque utiliza apenas o espaço necessário (ou seja, menos espaço é usado para armazenar valores mais curtos). A exceção é uma tabela MyISAM criada com ROW_FORMAT = FIXED, que utiliza uma quantidade fixa de espaço em disco para cada linha e, portanto, pode desperdiçar espaço. O VARCHAR ajuda o desempenho porque economiza espaço.
CHAR é de tamanho fixo: o MySQL sempre aloca espaço suficiente para o número especificado de caracteres. Ao armazenar um valor CHAR, o MySQL remove qualquer espaço à direita. (Isso também se aplicava ao VARCHAR no MySQL 4.1 e em versões anteriores - CHAR e VAR CHAR eram logicamente idênticos e diferiam apenas no formato de armazenamento.) Os valores são preenchidos com espaços conforme necessário para comparações.
VARCHAR
precisa alocar dinamicamente a memória como e quando necessário, reduzindo assim o desempenho, ao contrário CHAR
, certo?
Caractere ou varchar- é usado para inserir dados textuais onde o comprimento pode ser indicado entre parênteses, por exemplo, nome char (20)
(
e )
são parênteses, não colchetes.
(
e )
suportes, e muitos britânicos provavelmente nem sequer percebem que há dialetos do Inglês em que a palavra "parêntese" pode se referir a uma marca de pontuação. Há uma forte justificativa para preferir "parênteses" a "colchetes" - provavelmente é, em geral, a opção mais clara ao atingir um público internacional de programadores - mas é um caso mais complicado do que "colchetes" estarem errados.