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?

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top