Почему заполнение ANSI включено по умолчанию в SQL Server?

#sql #sql-server #string

#sql #sql-server #строка

Вопрос:

Может кто-нибудь объяснить мне, какая логика заключается в включении заполнения ANSI по умолчанию в SQL server.

Где два приведенных ниже фрагмента кода возвращают true

 if len('       ') = len('') begin
    print 'true'
end
else begin
    print 'false'
end

if '       ' = '' begin
    print 'true'
end
else begin
    print 'false'
end
 

РЕДАКТИРОВАТЬ: меня не волнует, что вы можете отключить его. Кто-нибудь знает, почему оно включено? Это решение по проектированию базы данных? Это оптимизация базы данных? Каковы положительные стороны этого использования? Для меня это, конечно, не имеет особого смысла — все, что я вижу, это негативы.

Комментарии:

1. Ну, из названия логика должна соответствовать стандарту? ANSI = Американский национальный институт стандартов.

2. Это просто настройка по умолчанию. Вы можете легко изменить его либо для каждой базы данных, либо для отдельных пакетов / транзакций. Аналогично тому, что параметры сортировки по умолчанию не чувствительны к регистру, что, по мнению некоторых людей, является плохим выбором.

3. Обратите внимание, что SET ANSI_PADDING OFF это устаревшая функция , которая даже не будет разрешена в некоторых будущих версиях.

4.Результаты в вашем примере не изменяются в элементах SET ANSI_PADDING OFF; ANSI_PADDING управления способом хранения значений столбца, меньших, чем определенный размер столбца, и способом хранения значений столбца с конечными пробелами в данных char, varchar, binary и varbinary.

5. Хороший момент @MartinSmith — я отклонил вопрос, потому что поведение, похоже, не связано с настройкой. Существует ли параметр, который изменяет поведение кода в вопросе?

Ответ №1:

Для соответствия спецификации ANSI / ISO SQL-92:

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

Ответ №2:

Тестирование поведения:

 SELECT SESSIONPROPERTY('ANSI_PADDING') AS [ANSI_PADDING]

SET ANSI_PADDING ON

IF '       ' = '' BEGIN
    PRINT 'TRUE'
END
ELSE BEGIN
    PRINT 'FALSE'
END

SET ANSI_PADDING OFF

IF '       ' = '' BEGIN
    PRINT 'TRUE'
END
ELSE BEGIN
    PRINT 'FALSE'
END

SET ANSI_PADDING ON
 

Вывод:

 TRUE
TRUE