Eu queria perguntar o significado deste fragmento do documento do Postgres em relação ao varchar(n)
tipo:
O requisito de armazenamento para uma string curta (até 126 bytes) é de 1 byte mais a string real, que inclui o preenchimento de espaço no caso de caractere. Strings mais longas têm 4 bytes de sobrecarga em vez de 1.
Vamos supor que eu tenha um varchar(255)
campo. E agora, as seguintes afirmações:
- Se esse campo contiver uma string de 10 bytes, a sobrecarga será de 1 byte. Portanto, a string usará 11 bytes.
- Se o campo contiver string usando 140 bytes, a sobrecarga será de 4 bytes. Portanto, a string usará 144 bytes.
Essas afirmações acima são verdadeiras? Aqui alguém entende o documento da mesma forma que eu, mas aqui alguém afirma que a sobrecarga é sempre de 4 bytes aqui ?
Sem surpresa, o manual está certo. Mas há mais do que isso.
Por um lado, o tamanho no disco (em qualquer tabela , mesmo quando não estiver realmente armazenado no disco) pode ser diferente do tamanho na memória . No disco, a sobrecarga para
varchar
valores curtos de até 126 bytes é reduzida para 1 byte , conforme indicado no manual. Mas a sobrecarga na memória é sempre de 4 bytes (uma vez que os valores individuais são extraídos).O mesmo é verdadeiro para
text
, ouvarchar
-varchar(n)
char(n)
exceto quechar(n)
é preenchido comn
caracteres em branco e você normalmente não deseja usá-lo. Seu tamanho efetivo ainda pode variar em codificações multibyte porquen
denota um máximo de caracteres, não bytes:Todos eles usam
varlena
internamente."char"
(entre aspas) é uma criatura diferente e sempre ocupa um único byte.Literais de cadeia de caracteres não digitados (
'foo'
) têm uma sobrecarga de um único byte. Não deve ser confundido com valores digitados!Teste com
pg_column_size()
.Como você pode ver:
integer
não tem sobrecarga (mas tem requisitos de alinhamento que podem impor preenchimento).varchar
ainda é de apenas 1 byte enquanto não foi extraído da linha - como pode ser visto no tamanho da linha. (É por isso que às vezes é um pouco mais rápido selecionar linhas inteiras.)Relacionado: