Qual é a diferença entre VARCHAR e CHAR?

366

Qual é a diferença entre VARCHAR e CHAR no MySQL?

Estou tentando armazenar hashes MD5.

steven
fonte
15
O hash MD5 sempre possui 32 caracteres. Portanto, para maximizar seu desempenho, use CHAR (32), pois o CHAR é de comprimento fixo (consulte as respostas abaixo para obter mais detalhes sobre as diferenças entre CHAR e VARCHAR).
Augustin

Respostas:

361

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).

Anon.
fonte
51
@steven: quando Anon. diz "seu conteúdo é de tamanho fixo", significa que as linhas da sua tabela devem conter todos os campos de tamanho fixo. Você não obtém melhoria de desempenho se usar CHAR em comparação com VARCHAR em um campo, mas a tabela contém outros campos que são VARCHAR.
Marco Demaio 20/05
2
nenhum tipo de dado char adiciona o desempenho ... enquanto a execução da consulta sql gera um plano de execução. Suponha que existam 2 colunas charcol char (2000) e VarcharCol Varchar (2000). No plano de execução, o tamanho estimado da linha para o tipo varchar de colunas pode estar subestimado. assim, leva o derramamento até a temperatura db. Então, usando char é bom para o desempenho
vignesh
11
qual é o significado do valor entre parênteses de VARCHAR (n)?
Sivagami Nambi
@Marco Demaio, você sabe o motivo por trás disso?
Dehan de Croos
11
@ jdc91: para aumentar o desempenho, toda a linha deve ter largura fixa. O MySQL obtém vantagem ao calcular os requisitos de espaço e deslocamento de linhas nesse tipo de tabela.
Marco Demaio 17/10
225

CARACTERES

  1. Usado para armazenar o valor da cadeia de caracteres de comprimento fixo .
  2. O máximo não. de caracteres que o tipo de dados pode conter é de 255 caracteres .
  3. É 50% mais rápido que o VARCHAR.
  4. Usa alocação de memória estática .

VARCHAR

  1. Usado para armazenar dados alfanuméricos de comprimento variável .
  2. O máximo que esse tipo de dados pode suportar é de até
    • Pré-MySQL 5.0.3: 255 caracteres .
    • Pós-MySQL 5.0.3: 65.535 caracteres compartilhados para a linha.
  3. É mais lento que o CHAR.
  4. Usa alocação dinâmica de memória .
simplePerson43
fonte
3
Estou um pouco surpreso que essa resposta tenha sido votada com tanta frequência. A documentação do MySQL declaraValues 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.
DroidOS
2
para não mencionar que você pode armazenar dados alfanuméricos em carvão também
ninjabber
44
O que é isso 50% mais rápido com base? 50% mais rápido para fazer o que? Em que condições? E o que você quer dizer com alocação de memória estática vs dinâmica neste contexto?
Martin Smith
4
@ MartinSmith, eu ia perguntar o mesmo ... não pense que as informações são precisas. asktom.oracle.com/pls/asktom/...
Ozgur Bar
2
-1; as alegações de desempenho aqui são vagas e sem fundamento, a diferença na estratégia de alocação de memória (e por que isso importa) não é detalhada, e a alegação de que o varchar armazena "dados alfanuméricos" é um pouco estranha; As colunas varchar certamente também podem armazenar caracteres não alfanuméricos!
Mark Amery
122

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

P Sharma
fonte
4
Cidade = char (10), Rua = varchar (10), cidade = Pune, rua = Oxford, comprimento (cidade) = 4, comprimento (rua) = 6
abdulwadood
2
esta consulta (selecione comprimento (cidade), comprimento (rua) de temp) está fornecendo a seguinte saída no mysql 5.7 mysql> selecione comprimento (cidade), comprimento (rua) de temp; + -------------- + ---------------- + | comprimento (cidade) | comprimento (rua) | + -------------- + ---------------- + | 4 6 + -------------- + ---------------- + 1 linha no conjunto (0.00 seg)
Jasbeer Rawal
69

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.

SLaks
fonte
44
"Uma coluna CHAR (x) pode ter apenas exatamente x caracteres". Na verdade, você pode adicionar dados com menos de x caracteres, mas acho que você quis dizer que sempre RESERVA 10 caracteres de memória nos bastidores.
Dan W
13
Você não sabe por que eles estão armazenando hashes MD5, existem muitos motivos válidos para usar o MD5 que não têm nada a ver com segurança. As colisões não são comuns e o algoritmo é mais rápido que as mais seguras.
John Hunt
11
Supondo que a coluna CHAR (x) não imponha exatamente os caracteres x, existe algum motivo para usá-la no VARCHAR (x), mesmo para dados de tamanho fixo?
NeverEndingQueue
11

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 CHARmesmo para colunas de tamanho variável devido à possível VARCHARfragmentaçã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 BINARYtipo 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.

Grygoriy Gonchar
fonte
Seguindo essa linha de raciocínio, eu usaria CHAR para IDs de negócios que visam legibilidade versus eficiência. Eu ainda usaria chaves primárias bigint.
Archimedes Trajano
9

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.

user1445657
fonte
7

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.

mobiGeek
fonte
5

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.

Andrew
fonte
Embora eu ache que as alegações sobre velocidade e eficiência de armazenamento aqui sejam verdadeiras, nenhuma delas é fundamentada de maneira alguma (e é perfeitamente plausível que sejam falsas), o que torna essa resposta inútil; apenas repete o que o leitor provavelmente já esperava que fosse verdade, sem fazer nada para realmente ajudar a confirmá-lo.
Mark Amery
1

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.

Donnie DeBoer
fonte
1

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.

Bob Minteer
fonte
0

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.

Alireza Rahmani Khalili
fonte
2
"O VARCHAR ajuda o desempenho porque economiza espaço " Sim, economiza espaço, mas não afeta negativamente o desempenho? VARCHARprecisa alocar dinamicamente a memória como e quando necessário, reduzindo assim o desempenho, ao contrário CHAR, certo?
Spikatrix
@Spikatrix Depends. Se os valores VARCHAR geralmente são pequenos, mas podem ter até N bytes, a alocação dinâmica pode economizar uma quantidade significativa de espaço e E / S, o que é mais eficiente para muitos dados. Valores CHAR que são aproximadamente iguais em comprimento seriam mais eficientes. Lê vs. escreve também provavelmente faz a diferença.
Andrew
-4

Char tem um comprimento fixo (suporta 2000 caracteres), significa caractere é um tipo de dados

Varchar tem um comprimento variável (suporta 4000 caracteres)

Amandeep
fonte
-1; esses números não estão corretos para o MySQL. (Eu acho que eles podem ser para a Oracle?) #
21420
-5

Caractere ou varchar- é usado para inserir dados textuais onde o comprimento pode ser indicado entre parênteses, por exemplo, nome char (20)

Amy
fonte
Isso não aborda a questão original. O OP está perguntando as diferenças práticas entre os tipos, não a sintaxe e o objetivo dos tipos. Também (e )são parênteses, não colchetes.
2mac
@ 2mac sua sentença final é verdadeira apenas no inglês americano; na Grã-Bretanha que chamamos (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.
Mark Amery
-11

CARACTERES :

  • Suporta caracteres e números.
  • Suporta 2000 caracteres.
  • Comprimento fixo.

VARCHAR:

  • Suporta caracteres e números.
  • Suporta 4000 caracteres.
  • Comprimento variável.

algum comentário......!!!!

YRSREDDY
fonte