#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