I have not noticed it anything wrong with it until lately. Check out the following codes:
select CharVar = ''123' - char(9) - no space',
CharLen = len(cast(''123'' as char(9))),
ReverseLen = len(reverse(cast(''123'' as char(9))))
union all
select CharVar = ''123' - char(9) - trailing 1 space',
CharLen = len(cast(''123' ' as char(9))),
ReverseLen = len(reverse(cast(''123' ' as char(9))))
union all
select CharVar = ''123' - char(9) - trailing 2 space',
CharLen = len(cast(''123' ' as char(9))),
ReverseLen = len(reverse(cast(''123' ' as char(9))))
As expected, the LEN() function ignored the trailing spaces. The LEN() of the returned string by the REVERSE() function, however, returned the full size of the character.CharVar CharLen ReverseLen
-------------------------------- ----------- -----------
''123'' - char(9) - no space 3 9
''123'' - char(9) - trailing 1 space 3 9
''123'' - char(9) - trailing 2 space 3 9
Now it starts to get weird...select CharVar = ''123' - char(9) - leading 1 space',
CharLen = len(cast(' '123'' as char(9))),
ReverseLen = len(reverse(cast(' '123'' as char(9))))
union all
select CharVar = ''123' - char(9) - leading 2 space',
CharLen = len(cast(' '123'' as char(9))),
ReverseLen = len(reverse(cast(' '123'' as char(9))))
union all
select CharVar = '123 - char(9) - leading 3 space',
CharLen = len(cast(' 123' as char(9))),
ReverseLen = len(reverse(cast(' 123' as char(9))))
Check out the results:CharVar CharLen ReverseLen
------------------------------- ----------- -----------
'123' - char(9) - leading 1 space 4 8
'123' - char(9) - leading 2 space 5 7
'123' - char(9) - leading 3 space 6 6
The LEN() function counted the leading spaces. After the REVERSE() function, however, it seems the LEN() returns the size of the char variable less the number of trailing spaces. I was under the impression that LEN() will ignore those spaces as, after the REVERSE(), it became trailing spaces.After further research, it looks like REVERSE() function returns the same datatype of the string being passed to it, as expected. If the character of the string passed is less than the full length of the character, reverse automatically returns a value with leading spaces.
To illustrate this, check this code:
select CharVar = 'x' + cast('123' as char(9)),
ReversedChar = 'x' + reverse(cast('123' as char(9)))
Here's the result:CharVar ReversedChar
---------- ------------
x123 x 321
The returned ReversedChar value reversed the string with the same data type. Since it's a char data type, the returned string included the expected spaces in the char variable.I guess this is not unexpected, maybe am just not aware...
To count the number of bytes in a var/character string, use the DATALENGTH() instead.
Comment?
~~ CK