Поведение Варшара с пробелами в конце

14

Когда я использую Varchar с пробелами, он игнорирует пробелы в конце.

например:

declare @X varchar(50)

Эта...

set  @X= 'John'

...такой же как...

set @X= 'John           '

Он считает, что они равны. Как я могу заставить систему распознавать их как разные?

АМГ
источник

Ответы:

23

Все в соответствии со стандартом ANSI:

Завершающие пробелы объяснили :

SQL Server следует спецификации ANSI / ISO SQL-92 (Раздел 8.2, Общие правила № 3), как сравнивать строки с пробелами. Стандарт ANSI требует заполнения для строк символов, используемых в сравнениях, чтобы их длина соответствовала перед сравнением. Заполнение напрямую влияет на семантику предикатов предложения WHERE и HAVING и другие сравнения строк Transact-SQL. Например, Transact-SQL считает, что строки 'abc' и 'abc' эквивалентны для большинства операций сравнения.

Единственным исключением из этого правила является предикат LIKE. Когда правая часть выражения предиката LIKE содержит значение с завершающим пробелом, SQL Server не дополняет два значения одинаковой длиной до того, как произойдет сравнение. Поскольку цель предиката LIKE по определению состоит в том, чтобы облегчить поиск по шаблону, а не в простых тестах на равенство строк, это не нарушает упомянутый ранее раздел спецификации ANSI SQL-92.

Вот хорошо известный пример всех случаев, упомянутых выше:

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

Вот еще несколько подробностей о конечных пробелах и LIKEпредложении .

НО, если вы хотите отличить их - вы можете решить использовать DATALENGTHфункцию вместо LEN, потому что

SELECT 1 WHERE LEN('John ') = LEN('John')

поставит вас 1 вместо

SELECT 1 WHERE DATALENGTH('John ') = DATALENGTH('John')

Решение является

  • использовать функцию DATALENGTH для различия между строками
  • для приведения строки в тип NVARCHAR - лучше объявить этот тип параметром SP
Олег Док
источник
Захватывающий пост, наконец-то нашел полезную информацию
Gaspa79
-2

Вы можете просто добавить пробел к вашему состоянию.

set @X= 'John           \n'

Конечные пробелы в строковых функциях

Yiping
источник
5
\nне имеет значения в SQL Server. Это не интерпретируется как новая строка. Это не ответ на вопрос, заданный в любом случае.
Мартин Смит
@MartinSmith, но написано в MSDN: «Если в вашей строке должны быть конечные пробелы, вам следует добавить символ пробела в конце, чтобы SQL Server не обрезал строку».
Yiping