Desafio T-SQL – CHAR X VARCHAR
Hoje a tarde meu amigo Adilson Pereira me mandou um desafio bem interessante, vou postar aqui exatamente do modo como ele propôs:
Observem a diferença que dá no resultado de um comando usando o CHAR e o VARCHAR:
declare @data datetime
set @data = '20100310 05:05:05'
SELECT
RIGHT('0' + CONVERT( CHAR(2), DATEPART(mi, @data)), 2) as 'CHAR',
RIGHT('0' + CONVERT(VARCHAR(2), DATEPART(mi, @data)), 2) as 'VARCHAR'
A solução é interessante :)
E você? Tem um palpite do porque?
Utilizando o left o resultado é o mesmo ’05′ para char e varchar.
LEFT de 0 + char(2): ele “converte” o char(2) para char(1) e retorna o 5 como o segundo caracter a partir da esquerda ???
RIGTH de 0 + char(2): ele não “converte” o char(2) para char(1) e só retorna o 5 como se fossem 2 caracteres a partir da direita??
Algo parecido? To curioso…
declare @data datetime
set @data = ’20100310 05:05:05′
SELECT
RIGHT(’0′ + CONVERT( CHAR(2), DATEPART(mi, @data)), 2) as ‘CHAR’,
RIGHT(’0′ + CONVERT(VARCHAR(2), DATEPART(mi, @data)), 2) as ‘VARCHAR’,
LEFT(’0′ + CONVERT( CHAR(2), DATEPART(mi, @data)), 2) as ‘CHAR’,
LEFT(’0′ + CONVERT(VARCHAR(2), DATEPART(mi, @data)), 2) as ‘VARCHAR’
Porque o Right? Ou aposto no no armazenamento do dado no datatype, vou testar mais!
a questão nao é o char ou varchar, mas sim o right.
Vamos lá: a expressão varchar antes do RIGHT seria ’5′ e a char ’5 ‘, concatenando ’0′ ficariam ’05′ e ’05 ‘. Utilizando RIGHT de duas posições, então o varchar retorna ’05′ e char ’5 ‘. Para o retorno correto principalmente para minuto com apenas 1 dígito é ideal usar o tipo VARCHAR por suprimir espaços em brancos, já que estamos querendo obter sempre 2 posições.
Na minha opinião é o seguinte…
Variaveis do tipo CHAR(n) recebem sempre o numero exato de caracteres do (n) e devem ser utilizadas sempre que voce tem certeza do numero de caracteres que serão inseridos nesta variavel, portanto a informação ’5′ fica como ’5 ‘.
“Use char when the sizes of the column data entries are consistent.”<– BooksOnline
Enquanto o VARCHAR(n) deve ser utilizado sempre que a quantidade de caracteres do (n) for desconhecida, tendo o (n) como tamanho maximo somente, com isso o SQL ajusta o tamanho da variavel sempre deixando a informação '5' como '5' mesmo.
Use varchar when the sizes of the column data entries vary considerably. <– Books Online
Se voce alterar o Valor do RIGHT para 3 vai ter como resultado '05 ' na variavel CHAR
SELECT RIGHT('0' + CONVERT( CHAR(2), DATEPART(mi, @data)), 3) [CHAR]