HiveBrain v1.2.0
Get Started
← Back to all entries
patternMajor

Empty Strings: Why or when is '' equal to ' '?

Submitted by: @import:stackexchange-dba··
0
Viewed 0 times
whyequalemptywhenstrings

Problem

Who can explain why

select case when '' = ' ' then 1 else 0 end, LEN(''), LEN(' '), DATALENGTH(''), DATALENGTH(' ');


yields

----------- ----------- ----------- ----------- -----------
1           0           0           0           1


The funny consequence of this is that in

create table test ( val varchar(10) );
insert into test values( '' );
update test set val = ' ' where val = '';


the update will indeed replace the empty string by a blank, but the where clause keeps to be true and repeated executions of the update statement tell

(1 row(s) affected)

Solution

Trailing blanks explained:


SQL Server follows the ANSI/ISO SQL-92 specification (Section 8.2,
, General rules #3) on how to compare strings
with spaces. The ANSI standard requires padding for the character
strings used in comparisons so that their lengths match before
comparing them. The padding directly affects the semantics of WHERE
and HAVING clause predicates and other Transact-SQL string
comparisons. For example, Transact-SQL considers the strings 'abc' and
'abc ' to be equivalent for most comparison operations.


The only exception to this rule is the LIKE predicate. When the right
side of a LIKE predicate expression features a value with a trailing
space, SQL Server does not pad the two values to the same length
before the comparison occurs. Because the purpose of the LIKE
predicate, by definition, is to facilitate pattern searches rather
than simple string equality tests, this does not violate the section
of the ANSI SQL-92 specification mentioned earlier.

Here's a well known example of all the cases mentioned above:

DECLARE @a VARCHAR(10)
DECLARE @b varchar(10)

SET @a = '1'
SET @b = '1 ' --with trailing blank

SELECT 1
WHERE 
    @a = @b 
AND @a NOT LIKE @b
AND @b LIKE @a


Here's some more detail about trailing blanks and the LIKE clause.

Code Snippets

DECLARE @a VARCHAR(10)
DECLARE @b varchar(10)

SET @a = '1'
SET @b = '1 ' --with trailing blank

SELECT 1
WHERE 
    @a = @b 
AND @a NOT LIKE @b
AND @b LIKE @a

Context

StackExchange Database Administrators Q#9456, answer score: 23

Revisions (0)

No revisions yet.