今天同事問我關於SQL Server在字符串尾隨着空格時進行字符串對比的做法。關於這個問題正好在這里講一下,就是SQL Server是按照ANSI/ISO SQL-92中的定義做字符串對比的。
在KB316626中已經做了闡述,就是SQL Server對待這種有尾隨空格的字符是會做自動截斷尾隨空格再對比的。
這里做個實驗吧
SELECT * FROM ( SELECT 'A' A UNION ALL SELECT 'A ' UNION ALL SELECT 'A ' UNION ALL SELECT 'A ') A WHERE A = 'A' SELECT A, COUNT(*) FROM ( SELECT 'A' A UNION ALL SELECT 'A ' UNION ALL SELECT 'A ' UNION ALL SELECT 'A ') A GROUP BY A SELECT A FROM ( SELECT 'A' A UNION ALL SELECT 'A ' UNION ALL SELECT 'A ' UNION ALL SELECT 'A ') A WHERE A like 'A %'
上面這段代碼會返回下面的結果
可以看到SQL Server在做字符串對比和排序(其實排序也需要做字符串對比)是會截斷尾隨空格的,而在做LIKE匹配的時候則例外。
那如果是空格開頭呢?這個肯定是沒有截斷起始空格的。再做一個實驗。
SELECT * FROM ( SELECT ' A' A UNION ALL SELECT 'A ' UNION ALL SELECT ' A ') A WHERE A = 'A' SELECT A, COUNT(*) FROM ( SELECT ' A' A UNION ALL SELECT 'A ' UNION ALL SELECT ' A ' UNION ALL SELECT ' A ') A GROUP BY A
上面這段代碼會返回下面的結果