Я знаю, что типы данных NUMERIC и DECIMAL в SQL Server работают одинаково: синтаксис их создания одинаков, диапазоны значений, которые можно хранить в них, одинаковы и т. Д.
Тем не менее, документация MSDN описывает отношения между ними так:
число функционально эквивалентно десятичному.
Обычно, когда я вижу квалификатор « функционально эквивалентный», это означает, что эти две вещи не совсем одинаковы, но это два разных типа, которые неотличимы снаружи .
Это правда? Существуют ли различия между NUMERIC и DECIMAL, которые просто ведут себя одинаково с внешним наблюдателем? Или они фактически эквивалентны, например, является ли NUMERIC просто устаревшим синонимом DECIMAL?
sql-server
KutuluMike
источник
источник
Ответы:
Они на самом деле эквивалентны, но они являются независимыми типами, а не технически синонимами, такими как
ROWVERSION
иTIMESTAMP
- хотя их, возможно, упоминали как синонимы в документации когда-то . Это немного другое значение синонима (например, они неразличимы, кроме имени, ни один не является псевдонимом для другого). Иронично, правда?Что я интерпретирую из формулировки в MSDN на самом деле:
Кроме
type_id
значений, все здесь идентично:Я абсолютно не знаю никаких поведенческих различий между ними, и, возвращаясь к SQL Server 6.5, всегда рассматривал их как взаимозаменяемые на 100%.
Только если вы делаете это явно. Вы можете легко это доказать, создав таблицу, а затем проверив план запроса на наличие запросов, которые выполняют явные или - вы можете ожидать - неявные преобразования. Вот простая таблица:
Теперь выполните эти запросы и запишите план:
Как показано в SQL Sentry Plan Explorer *, план не очень интересен:
Но вкладка «Выражения» точно такая:
Как я прокомментировал выше, у нас есть явные преобразования там, где мы их просили, но нет явных преобразований там, где мы могли бы их ожидать. Кажется, оптимизатор также рассматривает их как взаимозаменяемые.
Попробуйте этот тест тоже (данные и индексы).
Теперь запустите этот запрос:
План не имеет преобразований (фактически вкладка «Выражения» пуста):
Даже это не приводит к неожиданным преобразованиям. Конечно, вы видите это в RHS в предикате, но ни в коем случае не нужно было выполнять какое-либо преобразование данных столбца, чтобы облегчить поиск (тем более, принудительное сканирование).
Лично я предпочитаю использовать этот термин
DECIMAL
только потому, что он гораздо более точный и описательный.BIT
тоже "числовой".источник
Однако на практике они идентичны (из стандарта SQL 2003):
21) NUMERIC указывает тип данных точный числовой, с десятичной точностью и масштабом, указанными
precision
иscale
.22) DECIMAL указывает тип данных точный числовой, с десятичной шкалой, заданной десятичной точностью
scale
и определенной реализацией точностью, равной или превышающей значение указаннойprecision
.источник