O que significa o número especificado em uma cláusula varchar ()?
Pergunta
Apenas para esclarecer, especificando algo como Varchar (45) significa que pode levar até o máximo de 45 caracteres? Lembro que ouvi de alguém há alguns anos que o número nos parênteses não se refere ao número de personagens, então a pessoa tentou me explicar algo bastante complicado que eu não entendo e já esqueci.
E qual é a diferença entre Char e Varchar? Eu pesquisei um pouco e vi que o char fornece o máximo do tamanho da coluna e é melhor usá -lo se seus dados tiverem um tamanho fixo e usar o VARCHAR se o tamanho do seu dados varia.
Mas se fornecer o máximo do tamanho da coluna de todos os dados desta coluna, não é melhor usá -lo quando o tamanho dos dados varia? Especialmente se você não souber o tamanho do tamanho dos seus dados. Varchar precisa especificar o tamanho (o char não precisa, certo?), Não é mais problemático?
Solução
Você também tem que especificar o tamanho com CHAR
. Com CHAR
, os valores da coluna são acolchoados com espaços para preencher o tamanho especificado, enquanto que com VARCHAR
, apenas o valor real que você especificou é armazenado.
Por exemplo:
CREATE TABLE test (
char_value CHAR(10),
varchar_value VARCHAR(10)
);
INSERT INTO test VALUES ('a', 'b');
SELECT * FROM test;
O acima selecionará "A" para char_value
e "B" para varchar_value
Se todos os seus valores têm o mesmo tamanho, o CHAR
é possivelmente uma escolha melhor, porque geralmente exige menos espaço de armazenamento do que VARCHAR
. Isto é porque VARCHAR
armazena tanto o comprimento do valor quanto o próprio valor, enquanto CHAR
pode simplesmente armazenar o valor (de tamanho fixo).
Outras dicas
o Documentação do MySQL fornece uma boa explicação dos requisitos de armazenamento dos vários tipos de dados.
Em particular, para uma série de comprimento l, um CHAR(M)
O DatAtype assumirá bytes (M XC) (onde C é o número de bytes necessários para armazenar um personagem ... isso depende do caractere em uso). UMA VARCHAR(M)
ocupará (l + 1) ou (l + 2), dependendo de m ser <= 255 ou> 255.
Portanto, realmente depende de quanto tempo você espera que suas cordas sejam, qual será a variação do comprimento.
NB: A documetação não discute o impacto dos conjuntos de caracteres nos requisitos de armazenamento de um VARCHAR
modelo. Eu tentei citá-lo com precisão, mas meu palpite é que você precisaria multiplicar o comprimento da string pela largura de byte do caractere também para obter o requisito de armazenamento.
Char e Varchar realmente se tornam irrelevantes se você tiver apenas 1 campo de comprimento variável na sua tabela, como um Varchar ou texto. O MySQL alterará automaticamente todo o char para varchar.
O registro de comprimento/tamanho fixo pode fornecer desempenho extra, mas você não pode usar nenhum tipo de campo de comprimento variável. O motivo é que será mais rápido e fácil para o MySQL encontrar o próximo registro.
Por exemplo, se você fizer uma seleção * do limite da tabela 10, o MySQL precisará digitalizar o arquivo da tabela para o décimo registro. Isso significa encontrar o final de cada registro até encontrar o final do 10º recorde. Mas se sua tabela tiver registros de comprimento/tamanho fixo, o MySQL só precisará saber o tamanho do registro e, em seguida, pule 10 x #bytes.
Se você souber que uma coluna conterá um número pequeno e fixo de chars, use um char, caso contrário, use um varchar. Uma coluna Char é acolchoada para o comprimento máximo.
Varchar possui uma pequena sobrecarga (4-8 bytes, dependendo do RDBMS), mas usa apenas a sobrecarga + o número real de caracteres armazenados.
Para os valores que você sabe que eles serão constantes, por exemplo, para números de telefone, códigos postais etc., é ideal usar "char" com certeza.
O material complicado que você não se lembra é que os 45 se referem a bytes, não a chars. Não é o mesmo se você estiver usando uma codificação de caracteres multibyte. No Oracle, você pode especificar bytes ou chars explicitamente.
varchar2(45 BYTE)
ou
varchar2(45 CHAR)
Ver Diferença entre byte e char nos dados de dados da coluna