"Muitas vezes, você obtém o resultado certo sem fazer isso."
Exemplo:
select CONVERT(varchar, getdate(), 112)
saídas
20240417
Eu vi isso em alguns lugares no Stack Exchange até encontrar um pequeno comentário que dizia ao leitor para não esquecer o comprimento entre colchetes. Afirmei que isso não é necessário se você definir o número do estilo para uma data e hora como esta. No entanto, agora tenho conhecimento suficiente para entender que "varchar nunca deve ficar sozinho", deve sempre ser escrito como algo como varchar(1234)
.
Quanto ao código acima, seria:
select CONVERT(varchar(8), getdate(), 112)
Se você olhar para ele, a saída é a mesma:
20240417
Um comentário abaixo foi ainda mais longe: char(8)
deveria ser levado em consideração, já que
nenhum valor no estilo 112 será menor que 8 caracteres.
Por que você deve sempre escrever varchar com o comprimento entre colchetes atrás dele?
Freqüentemente e sempre são duas coisas distintas.
Exemplo:
A saída está faltando
uts
Isso se deve ao comportamento padrão :
O que significa que qualquer coisa sem o número de bytes na definição é, na melhor das hipóteses, um bug eventual e resulta em perda de dados que, na pior das hipóteses, ninguém saberá.
Além disso, observe que n in
varchar(n)
denota o número de bytes , não de caracteres:Por exemplo, em um contexto de agrupamento UTF8, o seguinte retorna 16:
Para armazenar essa string, você precisaria de pelo menos
varchar(16)
, nãovarchar(4)
.Não definir o comprimento de um varchar é comum, veja, por exemplo, Qual é o significado de 1/1/1753 no SQL Server? onde aparece a resposta mais votada
SELECT CONVERT(VARCHAR, DATEADD(DAY,-5,CAST('1752-09-13' AS DATETIME2)),100)
e ninguém reclamou depois de 13 anos e 171 mil visualizações. No entanto, ser difundido nem sempre significa ser bom.Por que você deveria colocar o comprimento atrás de cada
varchar
?Fora:
Achei que
8
não seria necessário, pois o comprimento da saída poderia ser definido pelo style112
. No entanto, uma observação em Converter data aaaa-mm-dd em número inteiro AAAAMM por @AaronBertrand mostra:E outra observação ainda pede que você faça,
char
em vez devarchar
se você tiver certeza de que deve ter esse comprimento o tempo todo:Seu blog Bad Habits to Kick: Varchar sem comprimento mostra em profundidade por que você deve escrever o comprimento entre colchetes atrás de any
varchar
: