Para esclarecer as coisas, podemos tomar a primeira afirmação que é muito fundamental:
A table can contain a maximum of 8,060 bytes per row.
Em outras palavras: cada linha deve caber em uma página (8 kB). E, se possível, muitas linhas podem caber em uma página - mas nunca o contrário.
Que tal objetos grandes binários (TEXT, NTEXT, BLOB)? Os dados nessas colunas são armazenados em um local especial. A linha apenas contém um ponteiro para os dados, portanto, a afirmação fundamental acima ainda é válida: uma linha da tabela deve caber em uma página.
Binary large data is stored outside of the table.
Each table row just holds a pointer in each BLOB field which actually points to the data.
Dito isso, o novo recurso varchar (max) é especial e se comporta da seguinte maneira:
- varchar (n): os campos de texto habituais armazenados na linha, os dados da linha devem caber em uma única página.
- varchar (máx), pequeno conteúdo de dados: armazenado na linha, desde que todos os dados da linha caibam em uma única página.
- varchar (max), conteúdo de big data: assim que os dados não cabem mais em uma página, um ponteiro é armazenado na linha e os dados varchar (max) são armazenados separadamente. Nesse caso, varchar (max) se comporta de maneira semelhante ao tipo de dados de texto.
Observe que o conteúdo de big data depende de todas as outras colunas da tabela. Além disso, varchar (max) pode armazenar texto em formato compactado de forma que mais de 8.060 caracteres possam se encaixar em uma página de dados.
Na minha opinião, a declaração O comprimento de cada uma dessas colunas ainda deve estar dentro do limite de 8.000 bytes parece não ser preciso, possivelmente até incorreto (uma coluna varchar (max) pode na verdade, segure 2 GB de dados, embora não sejam armazenados em fila).