Sql

Sql decimal тип данных: Типы данных

Содержание

Типы данных Microsoft SQL Server

Полный список всех типов данных в Microsoft SQL Server

Заголовки:

Источники

Приоритет типов данных (Transact-SQL)

Если оператор связывает два выражения различных типов данных, то по правилам приоритета типов данных определяется, какой тип данных имеет меньший приоритет и будет преобразован в тип данных с большим приоритетом. Если неявное преобразование не поддерживается, возвращается ошибка. Если оба операнда выражения имеют одинаковый тип данных, результат операции будет иметь тот же тип данных.

В SQL Server используется следующий приоритет типов данных:

  1. sql_variant
  2. xml
  3. datetimeoffset
  4. datetime2
  5. datetime
  6. smalldatetime
  7. date
  8. time
  9. float
  10. real
  11. decimal
  12. money
  13. smallmoney
  14. bigint
  15. int
  16. smallint
  17. tinyint
  18. bit
  19. ntext
  20. text
  21. image
  22. timestamp
  23. uniqueidentifier
  24. nvarchar (including nvarchar(max) )
  25. nchar
  26. varchar (including varchar(max) )
  27. char
  28. varbinary (including varbinary(max) )
  29. binary (lowest)

Синонимы типов данных (Transact-SQL)

Синонимы типов данных включены в SQL Server ради совместимости со спецификацией ISO. Эти синонимы и соответствующие им системные типы данных SQL Server приведены в следующей таблице.

СинонимСистемный тип данных SQL Server
Binary varyingvarbinary
char varyingvarchar
characterchar
characterchar(1)
character(n)char(n)
character varying(n)varchar(n)
Decdecimal
Double precisionfloat
float[(n)] for n = 1-7real
float[(n)] for n = 8-15float
integerint
national character(n)nchar(n)
national char(n)nchar(n)
national character varying(n)nvarchar(n)
national char varying(n)nvarchar(n)
national textntext
timestamprowversion

Синонимы типов данных можно использовать вместо соответствующих базовых типов данных в инструкциях языка определения данных (data definition language, DDL), таких как CREATE TABLE, CREATE PROCEDURE или DECLARE @variable. Однако после создания объекта синонимы утрачивают силу. При создании объекта ему назначается базовый тип данных, связанный с синонимом. Никаких признаков того, что в инструкции, создавшей объект, был указан синоним, не остается.

Всем объектам, производным от первоначального объекта, таким, как столбцы результирующего набора или выражения, назначается базовый тип данных. Все последующие вызовы функций работы с метаданными, выполняемые для первоначального объекта и любых производных от него объектов, сообщают базовый тип данных, а не синоним. Это имеет место при работе с метаданными, например в процедуре sp_help и других системных хранимых процедурах, представлениях информационных схем и различных API-операции над метаданными, сообщающих типы данных столбцов таблицы или результирующего набора.

Точность, масштаб и длина (Transact-SQL)

Точность представляет собой количество цифр в числе. Масштаб представляет собой количество цифр справа от десятичной запятой в числе. Например: число 123,45 имеет точность 5 и масштаб 2.

В среде SQL Server максимальная точность типов данных numeric и decimal по умолчанию составляет 38 разрядов. В более ранних версиях SQL Server максимум по умолчанию составляет 28.

Длиной для числовых типов данных является количество байт, используемых для хранения числа. Длина символьной строки или данных в Юникоде равняется количеству символов. Длина для типов данных binary, varbinary и image равна количеству байт. Например, тип данных int может содержать 10 разрядов, храниться в 4 байтах и не должен содержать десятичный разделитель. Тип данных int имеет точность 10, длину 4 и масштаб 0.

При сцеплении двух выражений типа char, varchar, binary или varbinary длина результирующего выражения является суммой длин двух исходных выражений, но не превышает 8 000 символов.

При сцеплении двух выражений типа nchar или nvarchar длина результирующего выражения является суммой длин двух исходных выражений, но не превышает 4 000 символов.

Если два выражения одного и того же типа данных, но разной длины, сравниваются с помощью предложения UNION, EXCEPT или INTERSECT, длина результата будет равняться длине максимального из двух выражений.

Точность и масштаб числовых типов данных, кроме decimal, фиксированы. Если арифметический оператор объединяет два выражения одного и того же типа, результат будет иметь тот же тип данных с точностью и масштабом, определенными для этого типа. Если оператор объединяет два выражения с различными числовыми типами данных, тип данных результата будет определяться правилами старшинства типов данных. Результат имеет точность и масштаб, определенные для этого типа данных.

Следующая таблица определяет, как вычисляется точность и масштаб результата, если результат операции имеет тип decimal. Результат имеет тип decimal, если одно из следующих утверждений является истиной:

  • Оба выражения имеют тип decimal.
  • Одно выражение имеет тип decimal, а другое имеет тип данных со старшинством меньше, чем decimal.

Выражения операндов обозначены как выражение e1 с точностью p1 и масштабом s1 и выражение e2 с точностью p2 и масштабом s2. Точность и масштаб для любого выражения, отличного от decimal, соответствуют типу данных этого выражения

ОперацияТочность результатаМасштаб результата *
e1 + e2max(s1, s2) + max(p1-s1, p2-s2) + 1max(s1, s2)
e1 — e2max(s1, s2) + max(p1-s1, p2-s2) + 1max(s1, s2)
e1 * e2p1 + p2 + 1s1 + s2
e1 / e2p1 — s1 + s2 + max(6, s1 + p2 + 1)max(6, s1 + p2 + 1)
e1 { UNION | EXCEPT | INTERSECT } e2max(s1, s2) + max(p1-s1, p2-s2)max(s1, s2)
e1 % e2min(p1-s1, p2 -s2) + max( s1,s2 )max(s1, s2)

* Точность и масштаб результата имеют абсолютный максимум, равный 38. Если значение точности превышает 38, то соответствующее значение масштаба уменьшается, чтобы по возможности предотвратить усечение целой части результата.

SQL Server, SSIS и Biml типы данных

Таблица ниже является упрощенной схемой связи между типами данныхSQL Server, SSIS и Biml. Таблица не включает все возможные комбинации и все виды типов данных, но полезна как быстрая ссылка при разработке и изучении Biml.

SQL ServerSSIS VariablesSSIS Pipeline BufferOLE DBADO.NETBiml
bigintInt64DT_I8LARGE_INTEGERInt64Int64
binaryObjectDT_BYTESBinaryBinary
bitBooleanDT_BOOLVARIANT_BOOLBooleanBoolean
charStringDT_STRVARCHARStringFixedLengthAnsiStringFixedLength
dateObjectDT_DBDATEDBDATE DateDate
datetimeDateTimeDT_DBTIMESTAMPDATEDateTimeDateTime
datetime2ObjectDT_DBTIMESTAMP2DBTIME2DateTime2DateTime2
datetimeoffsetObjectDT_DBTIMESTAMPOFFSETDBTIMESTAMPOFFSETDateTimeOffsetDateTimeOffset
decimalDecimalDT_NUMERICNUMERICDecimalDecimal
floatDoubleDT_R8FLOATDoubleDouble
geographyDT_IMAGEObjectObject
geometryDT_IMAGEObjectObject
hierarchyidDT_BYTESObjectObject
image (*)ObjectDT_IMAGEBinaryBinary
intInt32DT_I4LONGInt32Int32
moneyObjectDT_CY, DT_NUMERICCURRENCYCurrencyCurrency
ncharStringDT_WSTRNVARCHARStringFixedLengthStringFixedLength
ntext (*)StringDT_NTEXTStringString
numericDecimalDT_NUMERICNUMERICDecimalDecimal
nvarcharStringDT_WSTRNVARCHARStringString
nvarchar(max)ObjectDT_NTEXTString
realSingleDT_R4FLOAT, DOUBLESingleSingle
rowversionObjectDT_BYTES BinaryBinary
smalldatetimeDateTimeDT_DBTIMESTAMPDATEDateTimeDateTime
smallintInt16DT_I2SHORTInt16Int16
smallmoneyObjectDT_CY, DT_NUMERICCURRENCYCurrencyCurrency
sql_variantObjectDT_WSTR, DT_NTEXTObjectObject
tableObject
text (*)ObjectDT_TEXTAnsiString
timeObjectDT_DBTIME2DBTIME2TimeTime
timestamp (*)ObjectDT_BYTESBinaryBinary
tinyintByteDT_UI1BYTEByteByte
uniqueidentifierString, ObjectDT_GUIDGUIDGuidGuid
varbinaryObjectDT_BYTESBinaryBinary
varbinary(max)ObjectDT_IMAGEBinaryBinary
varcharStringDT_STRVARCHARStringAnsiString
varchar(max)ObjectDT_TEXTAnsiString
xmlObjectDT_NTEXTXml

(* Данные типы данных будут удалены в будущих версиях SQL Server. 31 — 1)n + 2Other Data TypescursorOther Data Typessql_variantmax 8016Other Data Typeshierarchyidmax 892Other Data Typesrowversion8Other Data Typestimestamp(*)Other Data Typesuniqueidentifier16Other Data Typesxmlmax 2GbOther Data TypestableSpatial Data TypesgeometrySpatial Data Typesgeography

SQL Server to MySQL, Oracle, PostgreSQL, SQLite Data Type Mapping

General TypeTypeMySQLOraclePostgreSQLSQLite
Exact NumericsbitTINYINT(1)NUMBER(3)BOOLEANINTEGER
Exact NumericstinyintTINYINT(signed)NUMBER(3)SMALLINTINTEGER
Exact NumericssmallintSMALLINTNUMBER(5)SMALLINTINTEGER
Exact NumericsintMEDIUMINT, INTNUMBER(10)INTINTEGER
Exact NumericsbigintBIGINTNUMBER(19)BIGINTINTEGER
Exact NumericsdecimalDECIMALNUMBER(p[,s])DECIMAL(p,s)REAL
Exact NumericssmallmoneyDOUBLENUMBER(10,4)MONEYREAL
Exact NumericsmoneyDOUBLENUMBER(19,4)MONEYREAL
Approximate NumericsfloatFLOAT
DOUBLE; REAL
FLOAT(49)DOUBLE PRECISIONREAL
Date and TimedateDATEDATETEXT
Date and TimesmalldatetimeTIMESTAMPDATETIMESTAMP(0)TEXT
Date and TimetimeTIMETIMETEXT
Date and Timedatetime2DDATETIMETIMESTAMPTEXT
Date and TimedatetimeDATETIMESTAMP(3)TEXT
Date and timedatetimeoffsetTIMESTAMP
with time zone
TEXT
Caracter StringscharCHARCHARCHARTEXT
Caracter StringsvarcharVARCHARVARCHAR2VARCHARTEXT
Caracter Stringsvarchar(max)VARCHAR2TEXTTEXT
Caracter StringsncharNCHARNCHARTEXT
Caracter StringsnvarcharNCHARVARCHARTEXT
Caracter Stringsnvarchar(max)VARCHAR
TINYTEXT
TEXT(M)
MEDIUMTEXT
LONGTEXT
NCHARTEXTTEXT
Caracter Stringsntext(*)LONGTEXTTEXT
Caracter Stringstext(*)LONGTEXTTEXT
Binary Stringsimage(*)LONGBLOBLONG RAWBYTEABLOB
Binary StringsbinaryBINARYRAWBYTEABLOB
Binary StringsvarbinaryRAWBYTEABLOB
Binary Stringsvarbinary(max)VARBINARY(M)
TINYBLOB
BLOB
MEDIUMBLOB
LONGBLOB
RAWBYTEABLOB
Other Data TypescursorTEXT
Other Data Typessql_variantBLOBTEXT
Other Data TypeshierarchyidTEXT
Other Data TypesrowversionBYTEATEXT
Other Data Typestimestamp(*)RAWBYTEATEXT
Other Data TypesuniqueidentifierCHARCHAR(36)CHAR(16)TEXT
Other Data TypesxmlXMLTEXT
Other Data Typestable
Spatial Data TypesgeometryVARCHARTEXT
Spatial Data TypesgeographyVARCHARTEXT

(* Данные типы данных будут удалены в будущих версиях SQL Server. Избегайте использование этих типов данных в новых проектах и, по возможности, измените их в текущих проектах.)

Тип данных DECIMAL. Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ

Читайте также

Восстановление данных

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

10.5 Пересылка данных

10.5 Пересылка данных Пересылка данных начинается после завершения трехшагового подтверждения создания соединения (см. рис. 10.9). Стандарт TCP позволяет включать в сегменты подтверждения обычные данные, но они не будут доставляться приложению, пока создание соединения не

Экспорт данных из базы данных Access 2007 в список SharePoint

Экспорт данных из базы данных Access 2007 в список SharePoint Access 2007 позволяет экспортировать таблицу или другой объект базы данных в различных форматах, таких как внешний файл, база данных dBase или Paradox, файл Lotus 1–2–3, рабочая книга Excel 2007, файл Word 2007 RTF, текстовый файл, документ XML

Перемещение данных из базы данных Access 2007 на узел SharePoint

Перемещение данных из базы данных Access 2007 на узел SharePoint Потребности многих приложений Access 2007 превышают простую потребность в управлении и сборе данных. Часто такие приложения используются многими пользователями организации, а значит, имеют повышенные потребности в

Спасение данных из поврежденной базы данных

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

Проверка введенных данных на уровне процессора баз данных

Проверка введенных данных на уровне процессора баз данных Помимо проверки данных во время ввода информации, следует знать о том, что можно также выполнять проверку и на уровне процессора баз данных. Такая проверка обычно более надежна, поскольку применяется независимо

Обновление базы данных с помощью объекта адаптера данных

Обновление базы данных с помощью объекта адаптера данных Адаптеры данных могут не только заполнять для вас таблицы объекта DataSet. Они могут также поддерживать набор объектов основных SQL-команд, используя их для возвращения модифицированных данных обратно в хранилище

Глава 2 Ввод данных. Типы, или форматы, данных

Глава 2 Ввод данных. Типы, или форматы, данных Работа с документами Excel сопряжена с вводом и обработкой различных данных, то есть ин формации, которая может быть текстовой, числовой, финансовой, статистической и т. д. МУЛЬТИМЕДИЙНЫЙ КУРС Методы ввода и обработки данных

1.2. Изменения типа данных DECIMAL

1.2. Изменения типа данных DECIMAL Этот раздел обсуждает характеристики типа данных DECIMAL (и синонимов) в MySQL 5.1, со специфическим отношением к следующим темамМаксимальное число цифр Формат хранения Требования к памятиНенормативное MySQL расширение к верхнему диапазону столбцов

Сортировка данных

Сортировка данных Практически вся информация, с которой вы работаете в электронном редакторе, представляет собой разнообразные списки. В терминологииMicrosoft Excel они называются «списками базы данных». Excel предоставляет возможность сортировать данные внутри таблицы по

Модель данных <> база данных

Модель данных &lt;&gt; база данных Тот «мир», который был получен в процессе описания и анализа, является черновиком для структур ваших данных. Считается, что логическая модель должна описывать отношения и наборы. Обычная ошибка (и западня, присущая всем инструментам CASE) слепо

Базы данных (классы для работы с базами данных)

Базы данных (классы для работы с базами данных) В MFC включены несколько классов, обеспечивающую поддержку приложений, работающих с базами данных. В первую очередь это классы ориентированные на работу с ODBC драйверами – CDatabase и CRecordSet. Поддерживаются также новые средства для

Есть ли разница между DECIMAL и NUMERIC в SQL Server?



Есть ли какая-то разница между типами данных DECIMAL и NUMERIC в SQL Server?

Когда я должен использовать DECIMAL и когда NUMERIC?

sql-server sqldatatypes
Поделиться Источник Dhanapal     17 апреля 2009 в 07:38

6 ответов


  • Разница между DECIMAL и NUMERIC

    В чем разница между типами данных SQL NUMERIC и DECIMAL ? Если базы данных трактуют их по-разному, я хотел бы знать, как по крайней мере: SQL Server Oracle ДБ / 2 MySQL PostgreSQL Кроме того, существуют ли какие-либо различия в том, как драйверы баз данных интерпретируют эти типы?

  • разница между float и [numeric](18, 10)

    в чем разница между типом sql server: float и [numeric](18, 10)



105

Это одно и то же. Числовое функционально эквивалентно десятичному.

MSDN: decimal и numeric

Поделиться Guffa     17 апреля 2009 в 07:43



41

Это то, что тогда стандарт SQL2003 (§6.1 типы данных) говорит об этих двух:

 <exact numeric type> ::=
    NUMERIC [ <left paren> <precision> [ <comma> <scale> ] <right paren> ]
  | DECIMAL [ <left paren> <precision> [ <comma> <scale> ] <right paren> ]
  | DEC [ <left paren> <precision> [ <comma> <scale> ] <right paren> ]
  | SMALLINT
  | INTEGER
  | INT
  | BIGINT

 ...

21) NUMERIC specifies the data type
    exact numeric, with the decimal
    precision and scale specified by the
    <precision> and <scale>.

22) DECIMAL specifies the data type
    exact numeric, with the decimal scale
    specified by the <scale> and the
    implementation-defined decimal
    precision equal to or greater than the
    value of the specified <precision>.

Поделиться Joakim Backman     17 апреля 2009 в 08:49



11

Насколько мне известно, нет никакой разницы между типами данных NUMERIC и DECIMAL. Они синонимичны друг другу, и любой из них может быть использован. Типы данных DECIMAL и NUMERIC-это числовые типы данных с фиксированной точностью и масштабом.

Редактировать:

Говоря с несколькими коллегами, возможно, это как-то связано с тем, что DECIMAL является стандартом ANSI SQL, а NUMERIC-тем, который предпочитает Mircosoft, поскольку он чаще встречается в языках программирования. …Может быть 😉

Поделиться kevchadders     17 апреля 2009 в 07:46




1

Они являются синонимами, никакой разницы в all. Decimal и числовые типы данных-это числовые типы данных с фиксированной точностью и масштабом.

-- Initialize a variable, give it a data type and an initial value

declare @myvar as decimal(18,8) or numeric(18,8)----- 9 bytes needed

-- Increse that the vaue by 1

set @myvar = 123456.7

--Retrieve that value

select @myvar as myVariable

Поделиться Raman Grewal     26 июля 2016 в 16:52



1

Ответ Йоакима Бэкмана конкретен, но это может внести в него дополнительную ясность.

Есть небольшая разница. Согласно SQL For Dummies, 8-е издание (2013):

Тип данных DECIMAL похож на NUMERIC. … с той разницей , что ваша реализация может указать точность, большую, чем вы указываете, — если это так, то реализация использует большую точность. Если вы не указываете точность или масштаб, реализация использует значения по умолчанию, как это происходит с типом NUMERIC.

Похоже, что разница в некоторых реализациях SQL заключается в целостности данных. DECIMAL допускает переполнение из того, что определено на основе некоторых системных значений по умолчанию, где as NUMERIC этого не делает.

Поделиться Alex Firsov     26 августа 2017 в 20:52



-2

Они совершенно одинаковы. Когда вы используете его, будьте последовательны. Используйте один из них в своей базе данных

Поделиться Faruk     05 сентября 2018 в 15:28


Похожие вопросы:


Есть ли у них какая-то разница между Sql server и Oracle

Насколько я знаю, и Sqlserver, и Oracle — это системы баз данных. 1.в случае Sql server мы можем работать сразу с несколькими базами данных. Есть ли у них какая-либо другая разница между oracle и…


Есть ли какая-то разница между sql server, который поставляется с VS2008 и sql server express 2008?

Есть ли какая-то разница между sql server, которая идет вместе с visual studio 2008 а sql server экспресс 2008 ? заранее спасибо


Должны ли вы выбрать типы данных MONEY или DECIMAL(x,y) в SQL Server?

Мне любопытно, есть ли реальная разница между типом данных money и чем-то вроде decimal(19,4) (который, как я полагаю, деньги используют внутренне). Я знаю, что money специфичен для SQL Server. Я…


Разница между DECIMAL и NUMERIC

В чем разница между типами данных SQL NUMERIC и DECIMAL ? Если базы данных трактуют их по-разному, я хотел бы знать, как по крайней мере: SQL Server Oracle ДБ / 2 MySQL PostgreSQL Кроме того,…


разница между float и [numeric](18, 10)

в чем разница между типом sql server: float и [numeric](18, 10)


Есть ли разница между SQL Server Express (2012) и LocalDB?

В своей превосходной и популярной сравнительной таблице ErikEJ проводит различие между SQL Server Express 2012 и SQL Server 2012 LocalDB . Однако я не могу найти такого различия больше нигде в…


Хранить «9999999.00000000» в SQL Server 2008 R2: ошибка арифметического переполнения при преобразовании numeric в тип данных numeric

Я пытаюсь сохранить 9999999.00000000 в SQL Server 2008 R2. Но я неоднократно сталкивался с этой ошибкой Ошибка арифметического переполнения при преобразовании numeric в тип данных numeric. Столбец…


Разница между DECIMAL и NUMERIC типами данных в PSQL

что такое использование типов данных decimal и numeric в postgreSQL. В соответствии со ссылкой ниже приводится объяснение, данное этим типам данных. Decimal,numeric —> It is a user specified…


Cakephp sql decimal форма ввода

Я использую cakephp 2. 6.4. и sql srv 2012. Мне нужно сохранить число decimal в формате decimal(4,2) — > 4 цифры до и 2 после разделителя. В sql server у меня есть тип данных decimal(4,2), а в модели…


Есть ли какая-то разница между rowcount и trancount

SQL SERVER 2012-разница между @@rowcount и @@trancount . Есть ли какая-то разница между rowcount и trancount в sql server 2012.

БД

Типы данных языка SQL, определенные стандартом

Данные – это совокупная информация, хранимая в базе данных в виде одного из нескольких различных типов. С помощью типов данных устанавливаются основные правила для данных, содержащихся в конкретном столбце таблицы, в том числе размер выделяемой для них памяти.

В языке SQL имеется шесть скалярных типов данных, определенных стандартом. Их краткое описание представлено в таблице.

Таблица 2.1.
Тип данных Объявления
Символьный CHAR | VARCHAR
Битовый BIT | BIT VARYING
Точные числа NUMERIC | DECIMAL | INTEGER | SMALLINT
Округленные числа FLOAT | REAL | DOUBLE PRECISION
Дата/время DATE | TIME | TIMESTAMP
Интервал INTERVAL
Символьные данные

Символьные данные состоят из последовательности символов, входящих в определенный создателями СУБД набор символов. Поскольку наборы символов являются специфическими для различных диалектов языка SQL, перечень символов, которые могут входить в состав значений данных символьного типа, также зависит от конкретной реализации. Чаще всего используются наборы символов ASCII и EBCDIC. Для определения данных символьного типа используется следующий формат:

<символьный_тип>::=
{ CHARACTER [ VARYING][длина] | [CHAR | 
VARCHAR][длина]}

При определении столбца с символьным типом данных параметр длина применяется для указания максимального количества символов, которые могут быть помещены в данный столбец (по умолчанию принимается значение 1). Символьная строка может быть определена как имеющая фиксированную или переменную (VARYING) длину. Если строка определена с фиксированной длиной значений, то при вводе в нее меньшего количества символов значение дополняется до указанной длины пробелами, добавляемыми справа. Если строка определена с переменной длиной значений, то при вводе в нее меньшего количества символов в базе данных будут сохранены только введенные символы, что позволит достичь определенной экономии внешней памяти.

Битовые данные

Битовый тип данных используется для определения битовых строк, т.е. последовательности двоичных цифр (битов), каждая из которых может иметь значение либо 0, либо 1. Данные битового типа определяются при помощи следующего формата:

<битовый_тип>::=
BIT [VARYING][длина]
Точные числа

Тип точных числовых данных применяется для определения чисел, которые имеют точное представление, т. е. числа состоят из цифр, необязательной десятичной точки и необязательного символа знака. Данные точного числового типа определяются точностью и длиной дробной части. Точность задает общее количество значащих десятичных цифр числа, в которое входит длина как целой части, так и дробной, но без учета самой десятичной точки. Масштаб указывает количество дробных десятичных разрядов числа.

<фиксированный_тип>::=
{NUMERIC[точность[,масштаб]|{DECIMAL|DEC}
   [точность[, масштаб]
| {INTEGER |INT}| SMALLINT}

Типы NUMERIC и DECIMAL предназначены для хранения чисел в десятичном формате. По умолчанию длина дробной части равна нулю, а принимаемая по умолчанию точность зависит от реализации. Тип INTEGER (INT) используется для хранения больших положительных или отрицательных целых чисел. Тип SMALLINT – для хранения небольших положительных или отрицательных целых чисел; в этом случае расход внешней памяти существенно сокращается.

Округленные числа

Тип округленных чисел применяется для описания данных, которые нельзя точно представить в компьютере, в частности действительных чисел. Округленные числа или числа с плавающей точкой представляются в научной нотации, при которой число записывается с помощью мантиссы, умноженной на определенную степень десяти (порядок), например: 10Е3, +5.2Е6, -0.2Е-4. Для определения данных вещественного типа используется формат:

<вещественный_тип>::=
{ FLOAT [точность]| REAL |
   DOUBLE PRECISION}

Параметр точность задает количество значащих цифр мантиссы. Точность типов REAL и DOUBLE PRECISION зависит от конкретной реализации.

Дата и время

Тип данных «дата/время» используется для определения моментов времени с некоторой установленной точностью. Стандарт SQL поддерживает следующий формат:

<тип_даты/времени>::=
{DATE | TIME[точность][WITH TIME ZONE]| 
   TIMESTAMP[точность][WITH TIME ZONE]}

Тип данных DATE используется для хранения календарных дат, включающих поля YEAR (год), MONTH (месяц) и DAY (день). Тип данных TIME – для хранения отметок времени, включающих поля HOUR (часы), MINUTE (минуты) и SECOND (секунды). Тип данных TIMESTAMP – для совместного хранения даты и времени. Параметр точность задает количество дробных десятичных знаков, определяющих точность сохранения значения в поле SECOND. Если этот параметр опускается, по умолчанию его значение для столбцов типа TIME принимается равным нулю (т.е. сохраняются целые секунды), тогда как для полей типа TIMESTAMP он принимается равным 6 (т.е. отметки времени сохраняются с точностью до миллисекунд). Наличие ключевого слова WITH TIME ZONE определяет использование полей TIMEZONE HOUR и TIMEZONE MINUTE, тем самым задаются час и минуты сдвига зонального времени по отношению к универсальному координатному времени (Гринвичскому времени).

Данные типа INTERVAL используются для представления периодов времени.

Понятие домена

Домен – это набор допустимых значений для одного или нескольких атрибутов. Если в таблице базы данных или в нескольких таблицах присутствуют столбцы, обладающие одними и теми же характеристиками, можно описать тип такого столбца и его поведение через домен, а затем поставить в соответствие каждому из одинаковых столбцов имя домена. Домен определяет все потенциальные значения, которые могут быть присвоены атрибуту.

Стандарт SQL позволяет определить домен с помощью следующего оператора:

<определение_домена>::=
   CREATE DOMAIN имя_домена [AS]
      тип_данных
   [ DEFAULT значение]
   [ CHECK (допустимые_значения)]

Каждому создаваемому домену присваивается имя, тип данных, значение по умолчанию и набор допустимых значений. Следует отметить, что приведенный формат оператора является неполным. Теперь при создании таблицы можно указать вместо типа данных имя домена.

Удаление доменов из базы данных выполняется с помощью оператора:

DROP DOMAIN имя_домена [ RESTRICT |
   CASCADE]

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

Альтернативой доменам в среде SQL Server являются пользовательские типы данных.

Типы данных, используемые в SQL-сервере

Системные типы данных

Один из основных моментов процесса создания таблицы – определение типов данных для ее полей. Тип данных поля таблицы определяет тип информации, которая будет размещаться в этом поле. Понятие типа данных в SQL Server полностью адекватно понятию типа данных в современных языках программирования. SQL-сервер поддерживает большое число различных типов данных: текстовые, числовые, двоичные (см. таблицу 2.2).

Таблица 2.2.
image smalldatetime bit binary
text real decimal char
uniqueidentifier money numeric timestamp
tinyint datetime smallmoney nvarchar
smallint float varbinary nchar
int ntext varchar sysname

Приведем краткий обзор типов данных SQL Server.

Для хранения символьной информации используются символьные типы данных, к которым относятся CHAR (длина), VARCHAR (длина), NCHAR (длина), NVARCHAR (длина). Последние два предназначены для хранения символов Unicode. Максимальное значение длины ограничено 8000 знаками (4000 – для символов Unicode).

Хранение символьных данных большого объема (до 2 Гб) осуществляется при помощи текстовых типов данных TEXT и NTEXT.

К целочисленным типам данных относятся INT (INTEGER), SMALLINT, TINYINT, BIGINT. Для хранения данных целочисленного типа используется, соответственно, 4 байта (диапазон от -231 до 231-1), 2 байта (диапазон от -215 до 215-1), 1 байт (диапазон от 0 до 255) или 8 байт (диапазон от -263 до 263-1). Объекты и выражения целочисленного типа могут применяться в любых математических операциях.

Числа, в составе которых есть десятичная точка, называются нецелочисленными. Нецелочисленные данные разделяются на два типа – десятичные и приблизительные.

К десятичным типам данных относятся типы DECIMAL [(точность[,масштаб])] или DEC и NUMERIC [(точность[,масштаб])]. Типы данных DECIMAL и NUMERIC позволяют самостоятельно определить формат точности числа с плавающей запятой. Параметр точность указывает максимальное количество цифр вводимых данных этого типа (до и после десятичной точки в сумме), а параметр масштаб – максимальное количество цифр, расположенных после десятичной точки. В обычном режиме сервер позволяет вводить не более 28 цифр, используемых в типах DECIMAL и NUMERIC (от 2 до 17 байт).

К приблизительным типам данных относятся FLOAT (точность до 15 цифр, 8 байт) и REAL (точность до 7 цифр, 4 байта). Эти типы представляют данные в формате с плавающей запятой, т.е. для представления чисел используется мантисса и порядок, что обеспечивает одинаковую точность вычислений независимо от того, насколько мало или велико значение.

Для хранения информации о дате и времени предназначены такие типы данных, как DATETIME и SMALLDATETIME, использующие для представления даты и времени 8 и 4 байта соответственно.

Типы данных MONEY и SMALLMONEY делают возможным хранение информации денежного типа; они обеспечивают точность значений до 4 знаков после запятой и используют 8 и 4 байта соответственно.

Тип данных BIT позволяет хранить один бит, который принимает значения 0 или 1.

В среде SQL Server реализован ряд специальных типов данных.

Тип данных TIMESTAMP применяется в качестве индикатора изменения версии строки в пределах базы данных.

Тип данных UNIQUEIDENTIFIER используется для хранения глобальных уникальных идентификационных номеров.

Тип данных SYSNAME предназначен для идентификаторов объектов.

Тип данных SQL_VARIANT позволяет хранить значения любого из поддерживаемых SQL Server типов данных за исключением TEXT, NTEXT, IMAGE и TIMESTAMP.

Тип данных TABLE, подобно временным таблицам, обеспечивает хранение набора строк, предназначенных для последующей обработки. Тип данных TABLE может применяться только для определения локальных переменных и возвращаемых пользовательскими функциями значений. Пример использования типа данных TABLE приведен в лекции, посвященной функциям пользователя.

Тип данных CURSOR нужен для работы с такими объектами, как курсоры, и может быть востребован только для переменных и параметров хранимых процедур. Курсоры SQL Server представляют собой механизм обмена данными между сервером и клиентом. Курсор позволяет клиентским приложениям работать не с полным набором данных, а лишь с одной или несколькими строками. Примеры использования данных типа CURSOR мы рассмотрим в лекциях, посвященных курсорам и хранимым процедурам.

Создание пользовательского типа данных

В системе SQL-сервера имеется поддержка пользовательских типов данных. Они могут использоваться при определении какого-либо специфического или часто употребляемого формата.

Создание пользовательского типа данных осуществляется выполнением системной процедуры:

sp_addtype [@typename=]type,[@phystype=] 
   system_data_type
      [,[@nulltype=]’null_type’]

Тип данных system_data_type выбирается из следующей таблицы.

Таблица 2.3.
image smalldatetime decimal bit
text real ‘decimal[(p[,s])]’ ‘binary(n)’
uniqueidentifier datetime numeric ‘char(n)’
smallint float ‘numeric[(p[,s])]’ ‘nvarchar(n)’
int ‘float(n)’ ‘varbinary(n)’
ntext ‘varchar(n)’ ‘nchar(n)’
EXEC sp_addtype bir, DATETIME, 'NULL' 
или 
EXEC sp_addtype bir, DATETIME, ‘NOT NULL’
Пример 2. 1. Создание пользовательского типа данных bir.
CREATE TABLE tab
(id_n	INT IDENTITY(1,1) PRIMARY KEY,
names	VARCHAR(40), 
birthday	BIR)
Пример 2.2. Использование пользовательского типа данных bir при создании таблицы.

Удаление пользовательского типа данных происходит в результате выполнения процедуры sp_droptype type: EXEC sp_droptype ‘bir’

Получение информации о типах данных

Получить список всех типов данных, включая пользовательские, можно из системной таблицы systypes:

Преобразование типов

Нередко требуется конвертировать значения одного типа в значения другого. Наиболее часто выполняется конвертирование чисел в символьные данные и наоборот, для этого используется специализированная функция STR. Для выполнения других преобразований SQL Server предлагает универсальные функции CONVERT и CAST, с помощью которых значения одного типа преобразовываются в значения другого типа, если такие изменения вообще возможны. CONVERT и CAST примерно одинаковы и могут быть взаимозаменяемыми.

CAST(выражение AS тип_данных)
CONVERT(тип_данных[(длина)],
   выражение [,стиль])

С помощью аргумента стиль можно управлять стилем представления значений следующих типов данных: дата/время, денежный или нецелочисленный.

DECLARE @d DATETIME
DECLARE  @s CHAR(8)
SET @s=’29.10.01’
SET @d=CAST(@s AS DATETIME)
Пример 2.3. Преобразование данных символьного типа к данным типа дата/время.

Наряду с типами данных основополагающими понятиями при работе с языком SQL в среде MS SQL Server являются выражения, операторы, переменные, управляющие конструкции.

Выражения

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

Выражение состоит из операндов (собственно данных) и операторов (знаков операций, производимых над операндами). В качестве операндов могут выступать константы, переменные, имена столбцов, функции, подзапросы.

Операторы – это знаки операций над одним или несколькими выражениями для создания нового выражения. Среди операторов можно выделить унарные операторы, операторы присваивания, арифметические операторы, строковые операторы, операторы сравнения, логические операторы, битовые операторы.

Переменные

В среде SQL Server существует несколько способов передачи данных между командами. Один из них – передача данных через локальные переменные. Прежде чем использовать какую-либо переменную, ее следует объявить. Объявление переменной выполняется командой DECLARE, имеющей следующий формат:

DECLARE {@имя_переменной тип_данных }
   [,...n]

Значения переменной можно присвоить посредством команд SET и SELECT. С помощью команды SELECT переменной можно присвоить не только конкретное значение, но и результат вычисления выражения.

DECLARE @a INT
SET @a=10
Пример 2.4. Использование SET для присваивания значения локальной переменной.
DECLARE @k INT
SELECT @k=SUM(количество) FROM Товар
Пример 2. 5. Использование SELECT для присваивания локальной переменной результата вычислений.

Управляющие конструкции SQL

Язык SQL является непроцедурным, но тем не менее в среде SQL Server предусмотрен ряд различных управляющих конструкций, без которых невозможно написание эффективных алгоритмов.

Группировка двух и более команд в единый блок осуществляется с использованием ключевых слов BEGIN и END:

<блок_операторов>::=
BEGIN
{ sql_оператор | блок_операторов }
END

Сгруппированные команды воспринимаются интерпретатором SQL как одна команда. Подобная группировка требуется для конструкций поливариантных ветвлений, условных и циклических конструкций. Блоки BEGIN…END могут быть вложенными.

Некоторые команды SQL не должны выполняться вместе с другими командами (речь идет о командах резервного копирования, изменения структуры таблиц, хранимых процедур и им подобных), поэтому их совместное включение в конструкцию BEGIN…END не допускается.

Нередко определенная часть программы должна выполняться только при реализации некоторого логического условия. Синтаксис условного оператора показан ниже:

<условный_оператор>::=
IF лог_выражение
  { sql_оператор | блок_операторов }
[ ELSE
  {sql_оператор | блок_операторов } ]

Циклы организуются с помощью следующей конструкции:

<оператор_цикла>::=
WHILE лог_выражение
   { sql_оператор | блок_операторов }
   [ BREAK ]
   { sql_оператор | блок_операторов }
   [ CONTINUE ]

Цикл можно принудительно остановить, если в его теле выполнить команду BREAK. Если же нужно начать цикл заново, не дожидаясь выполнения всех команд в теле, необходимо выполнить команду CONTINUE.

Для замены множества одиночных или вложенных условных операторов используется следующая конструкция:

<оператор_поливариантных_ветвлений>::=
CASE входное_значение
WHEN {значение_для_сравнения |
   лог_выражение } THEN
   вых_выражение [,...n]
[ ELSE иначе_вых_значение ]
END

Если входное значение и значение для сравнения совпадают, то конструкция возвращает выходное значение. Если же значение входного параметра не найдено ни в одной из строк WHEN…THEN, то тогда будет возвращено значение, указанное после ключевого слова ELSE.

Основные объекты структуры базы данных SQL-сервера

Рассмотрим логическую структуру базы данных.

Логическая структура определяет структуру таблиц, взаимоотношения между ними, список пользователей, хранимые процедуры, правила, умолчания и другие объекты базы данных.

Логически данные в SQL Server организованы в виде объектов. К основным объектам базы данных SQL Server относятся объекты, представленные в таблице 2.4.

Таблица 2.4.
Tables Таблицы базы данных, в которых хранятся собственно данные
Views Просмотры (виртуальные таблицы) для отображения данных из таблиц
Stored Procedures Хранимые процедуры
Triggers Триггеры – специальные хранимые процедуры, вызываемые при изменении данных в таблице
User Defined function Создаваемые пользователем функции
Indexes Индексы – дополнительные структуры, призванные повысить производительность работы с данными
User Defined Data Types Определяемые пользователем типы данных
Keys Ключи – один из видов ограничений целостности данных
Constraints Ограничение целостности – объекты для обеспечения логической целостности данных
Users Пользователи, обладающие доступом к базе данных
Roles Роли, позволяющие объединять пользователей в группы
Rules Правила базы данных, позволяющие контролировать логическую целостность данных
Defaults Умолчания или стандартные установки базы данных

Приведем краткий обзор основных объектов баз данных.

Таблицы

Все данные в SQL содержатся в объектах, называемых таблицами. Таблицы представляют собой совокупность каких-либо сведений об объектах, явлениях, процессах реального мира. Никакие другие объекты не хранят данные, но они могут обращаться к данным в таблице. Таблицы в SQL имеют такую же структуру, что и таблицы всех других СУБД и содержат:

  • cтроки; каждая строка (или запись) представляет собой совокупность атрибутов (свойств) конкретного экземпляра объекта;
  • cтолбцы; каждый столбец (поле) представляет собой атрибут или совокупность атрибутов. Поле строки является минимальным элементом таблицы. Каждый столбец в таблице имеет определенное имя, тип данных и размер.
Представления

Представлениями (просмотрами) называют виртуальные таблицы, содержимое которых определяется запросом. Подобно реальным таблицам, представления содержат именованные столбцы и строки с данными. Для конечных пользователей представление выглядит как таблица, но в действительности оно не содержит данных, а лишь представляет данные, расположенные в одной или нескольких таблицах. Информация, которую видит пользователь через представление, не сохраняется в базе данных как самостоятельный объект.

Хранимые процедуры

Хранимые процедуры представляют собой группу команд SQL, объединенных в один модуль. Такая группа команд компилируется и выполняется как единое целое.

Триггеры

Триггерами называется специальный класс хранимых процедур, автоматически запускаемых при добавлении, изменении или удалении данных из таблицы.

Функции

Функции в языках программирования – это конструкции, содержащие часто исполняемый код. Функция выполняет какие-либо действия над данными и возвращает некоторое значение.

Индексы

Индекс – структура, связанная с таблицей или представлением и предназначенная для ускорения поиска информации в них. Индекс определяется для одного или нескольких столбцов, называемых индексированными столбцами. Он содержит отсортированные значения индексированного столбца или столбцов со ссылками на соответствующую строку исходной таблицы или представления. Повышение производительности достигается за счет сортировки данных. Использование индексов может существенно повысить производительность поиска, однако для хранения индексов необходимо дополнительное пространство в базе данных.

Пользовательские типы данных

Пользовательские типы данных – это типы данных, которые создает пользователь на основе системных типов данных, когда в нескольких таблицах необходимо хранить однотипные значения; причем нужно гарантировать, что столбцы в таблице будут иметь одинаковый размер, тип данных и чувствительность к значениям NULL.

Ограничения целостности

Ограничения целостности – механизм, обеспечивающий автоматический контроль соответствия данных установленным условиям (или ограничениям). Ограничения целостности имеют приоритет над триггерами, правилами и значениями по умолчанию. К ограничениям целостности относятся: ограничение на значение NULL, проверочные ограничения, ограничение уникальности (уникальный ключ), ограничение первичного ключа и ограничение внешнего ключа. Последние три ограничения тесно связаны с понятием ключей.

Правила

Правила используются для ограничения значений, хранимых в столбце таблицы или в пользовательском типе данных. Они существуют как самостоятельные объекты базы данных, которые связываются со столбцами таблиц и пользовательскими типами данных. Контроль значений данных может быть реализован и с помощью ограничений целостности.

Умолчания

Умолчания – самостоятельный объект базы данных, представляющий значение, которое будет присвоено элементу таблицы при вставке строки, если в команде вставки явно не указано значение для этого столбца.

Подробно о типах данных | SQL

В следующих выпусках рубрики «T-SQL для начинающих» будет рассказано о применении синтаксиса T-SQL для построения таблиц. Но прежде чем начинать строить таблицы, необходимо поговорить о типах данных. Для каждого столбца таблицы должен быть определен некоторый тип данных, например, целые (integer) или символьные (character). Это позволяет системе в последующем контролировать данные, которые будут помещаться в этот столбец. В предлагаемой статье автор рассматривает предусмотренные в системе типы данных и рассказывает о том, как создавать собственные типы данных. Подобные дополнительные типы данных следует создать до того как начнется построение таблиц, ведь при создании таблиц могут понадобиться ссылки на эти типы данных. Определяемые пользователями типы данных позволят существенно усилить контроль над данными и повысить их целостность, особенно в проектах, в которых с базами данных параллельно работают несколько разработчиков.

При создании таблицы необходимо указать тип данных для каждого столбца. Любые данные, помещаемые в столбец, должны отвечать этому типу данных. В некоторых случаях следует указывать и допустимую длину данных в столбце. В листинге 1 приведен оператор SQL, который создает таблицу авторов Authors в базе данных публикаций Pubs, спользуя только предусмотренные в системе типы данных.

Большинство столбцов в этой таблице являются текстовыми полями. Номер телефона, обозначение штата и почтовый индекс всегда имеют постоянную длину, поэтому соответствующие им столбцы phone, state и ZIP удобнее объявить символьными (char). Имя автора, его адрес и город, где он живет, могут различаться по длине, поэтому для них предпочтительнее использовать тип символьных данных переменной длины (varchar). Столбец contract с информацией о наличии контракта с автором, в котором данные представляются в форме да/нет, целесообразно отнести к двоичному типу данных bit, у которого имеется два возможных значения — 0 и 1. Теперь остановимся подробнее на системных типах данных.

В версии SQL Server 6.0 определено 19 типов данных, а в версии SQL Server 7.0 добавлено еще 4 типа для удобства работы с закодированными с помощью Unicode данными, а также для поддержки приложений, основанных на использовании хранилищ данных. Каждый тип данных имеет ряд разновидностей, отличающихся возможным набором значений. Знание этих значений облегчит выбор подходящего типа данных.

Символьные данные типа char предсавляют собой один из наиболее распространенных типов данных. К этому типу относятся такие символьные данные, как имена или адреса. В версии SQL Server 6.5 длина любого столбца с символьными данными ограничивалась 255 знаками. Если же информация оказывалась длиннее, к примеру, если в столбец предполагалось вводить свободный комментарий по поводу контракта, то тогда следовало использовать текстовый тип данных (text). В SQL Server 7.0 это ограничение отменено, так что символьное поле может содержать до 8000 байтов. Верхняя граница обусловлена размером страницы памяти, поскольку ни одна запись не может располагаться в памяти на нескольких страницах. В тех случаях, когда для столбца определен тип данных char, данные следует помещать в одинарных кавычках, как показано в следующем примере:

UPDATE.....
SET.....
WHERE.....

Как отмечалось в статье «Работа с символьными данными», помещенной в майском номере журнала, можно выбрать символьный тип данных либо фиксированной длины, char, либо переменной длины, varchar. Фиксированный размер оказывается предпочтительным в тех случаях, когда данные имеют одинаковую или сходную длину, например, при вводе идентификатора автора (часто в этом качестве используют индивидуальный номер системы социальной безопасности, что, кстати, является плохим примером для подражания). В большинстве ситуаций применение переменной длины данных не приводит к сколько-нибудь заметному увеличению времени обработки. В то же время фамилия автора может быть очень длинной, так что использование типа varchar оказывается вполне оправданным. Применительно к подавляющему большинству фамилий фиксированная длина поля означает потерю значительного объема памяти, поэтому лучше использовать тип данных varchar. При выборе того или иного типа данных всегда следует искать компромисс с учетом двух аспектов: с одной стороны, потери полезного объема памяти при использовании данных фиксированной длины, а с другой стороны, увеличения времени обработки в случае применения данных переменной длины.

SQL Server 7.0 поддерживает набор символов Unicode. В связи с этим, чтобы воспользоваться всеми преимуществами, предоставляемыми расширенными возможностями Unicode, необходимо было ввести дополнительный тип данных.Если вам захочется использовать символьные данные Unicode, то следует указать тип данных Nchar или, если это информация переменной длины, то Nvarchar. При вводе данных Unicode их следует заключать в одиночные кавычки, причем непосредственно перед ними необходимо поставить заглавную латинскую букву N. Если в рассмотренном ранее примере имя автора отнесено к типу данных Unicode, то предыдущий оператор обновления примет следующий вид:

UPDATE. ....
SET.....
WHERE.....

Ограничение максимальной длины информации при работе с типом данных Unicode составляет 4000 знаков. Это объясняется тем, что для хранения каждого символа Unicode требуется два байта памяти. Поэтому на стандартную страницу памяти размером 8К можно поместить в два раза меньше символов Unicode, чем при использовании обычных символов.

Базовый тип целых чисел integer охватывает диапазон от -2 147 483 638 до 2 147 483 647. Уменьшенные целые smallint включают числа от -32 768 до 32767. Зачастую, когда точно известно, что диапазон возможных числовых значений данных невелик, лучше применять тип данных smallint. К примеру, в базе данных личной коллекции компакт-дисков при выборе типа данных для первичного ключа целесообразно использовать тип данных smallint. Ведь предположение о том, что число компакт-дисков в такой коллекции превысит 32 676 единиц, кажется неправдоподобным. В этой ситуации не следует для оптимизации памяти использовать тип данных tinyint, поскольку он позволяет обрабатывать только значения от 0 до 255. Такой тип данных можно было бы применить для нумерации депозитных сертификатов, а для коллекции компакт-дисков он может оказаться недостаточным.

Если приложение таково, что необходимо получать из базы данных числовое значение в строго указанном формате, то для этого следует выбрать один из точных числовых типов данных. Существуют два точных числовых типа данных: десятичный (decimal) и числовой (numeric), которые по существу совпадают друг с другом. Для них можно задать требуемые точность p и масштаб s в формате decimal (p,s). Точность представляет собой число значащих символов по обе стороны от десятичной запятой, а масштаб — количество символов справа от нее. Например, число 123,4567 можно хранить в столбце, для которого тип данных задан в виде (7,4). Если число, которое должно быть помещено в столбец с точным числовым типом данных, содержит больше десятичных знаков, чем указано в типе данных, то такое число округляется до требуемой точности. Числовые типы данных могут использовать для хранения значений от 2 до 17 байтов.

Некоторые числа нельзя точно представить в десятичном виде с ограниченным числом знаков, например, одну треть или число пи. Для записи таких чисел используются действительный (real) или плавающий (float) типы данных. Данные действительного типа хранятся с точностью от 1 до 7 знаков. Плавающий формат, который иногда называют еще форматом двойной точности, может хранить числа, содержащие от 8 до 15 значащих цифр. Действительный и плавающий типы данных применяются в научных приложениях для хранения чисел, не требующих точного двоичного выражения. Одна-две последние цифры могут не вполне точно сохраняться при преобразованиях в двоичный формат. Поэтому такие числа не следует использовать в операциях точного сравнения, применяемых для формулирования условий оборота WHERE.

Предположим, что в базе данных необходимо хранить двоичную информацию. В этой ситуации имеется выбор между двумя форматами представления: c фиксированной или переменной длиной. Данным фиксированной длины соответствует тип данных binary, а двоичным данным переменной длины соответствует тип данных varbinary.

Для представления денежных значений используются два типа данных: денежный (money) и малый денежный (smallmoney). Тип данных денежный применяется для хранения значений от плюс до минус 922 триллионов. Большинство из нас вполне может пользоваться малым денежным типом данных, который перекрывает диапазон значений от -214 748,3648 до +214 748,3647. По существующей договоренности денежный тип данных при хранении имеет четыре десятичных знака после запятой, а для его представления пользователям требуется только два знака . Отметим, что многие финансовые транзакции не используют денежный тип данных. Например, в биржевыех торговых операциях применяются 1/32 доли, для хранения которых необходимо пять десятичных мест.

В SQL Server и дата и время хранятся в одном столбце, так что если с помощью функции GETDATE() запросить текущую дату, то при этом система сообщит и время. Для дат применяются два типа данных, datetime и smalldatetime. Тип данных smalldatetime охватывает период времени от 1 января 1900 года до 6 июня 2079 года и включает время с точностью до минуты. Такого диапазона достаточно для подавляющего большинства проектов. Тип данных datetime годен для использования до 31 декабря 9999 года (это следует учитывать при решении проблемы 10К года). Начало диапазона этого типа данных датируется 1 января 1753 года. Почему 1753? Это связано с переходом с юлианского на грегорианский календарь. Несмотря на то, что грегорианский календарь был предложен некоторое время назад, процесс его принятия продолжался в течение приблизительно 30 лет. На протяжении этого периода некоторые страны уже приняли грегорианский, а другие еще нет. Поэтому для того, чтобы дата воспринималась однозначно, надо знать географическое положение объекта. Кроме того, год начинался не 1 января, а 1 марта. Поэтому такая дата, как 15 января 1792 года, может интерпретироваться и как середина первого месяца 1492 года, и как середина 11-го месяца 1793 года. Создатели SQL Server решили не рисковать, и поэтому приняли решение не воспринимать даты, относящиеся к периоду времени до начала 1753 года. Следует отметить также, что тип данных datetime показывает тысячные доли секунды, хотя точность гарантируется только до 1/300 части секунды.

Для символьных данных длиннее, чем 255 знаков, в SQL Server 6.5 следует применять тип данных текст (text). В SQL Server 7.0 граница применимости этого типа данных отодвигается до 8000 знаков. Для больших двоичных объектов (BLOB), таких как цифровые образы, используется тип данных образ (image). ?анные типа текст или образ не хранятся в строках, поэтому к ним не применимо ограничение на размер страницы памяти. В строках хранятся лишь указатели на страницы базы данных, в которых находится информация. Для обновления этих типов данных необходимы специальные процедуры, которые выходят за рамки рассмотрения настоящей статьи. (Более подробно об этом написано в статье Майкла Оути «Нам не страшен огромный BLOB», опубликованной в апрельском номере журнала. ) Здесь необходимо отметить только то, что изменения текстовых данных или образов не фиксируются в журнале, а указатели не обновляются. Изменяются только сами поля, содержащие текст или образ.

Некоторые типы данных трудно отнести к какой-либо категории. Один из таких типов — битовые данные (bit). Это целое число, которое может принимать только два значения — 0 и 1 (в одном байте можно хранить восемь подобных величин). Битовые значения часто применяются в качестве флагов, принимающих значения истина или ложь. Их можно использовать, например, для хранения сведений о том, заключен ли контракт с автором, или принадлежат ли его книги к бестселлерам, или для чего-либо аналогичного. Одно незначительнгое отличие версии SQL Server 7.0 состоит в том, что для столбцов с битовыми данными теперь разрешены и неопределенные значения, в то время как в версии SQL Server 6.5 допустимы были только значения 0 и 1.

Для внутренних целей в SQL Server используется тип данных метка времени (timestamp). Этот тип данных генерирует уникальное значение, которое обновляется каждый раз, когда модифицируется информация в строке таблицы. Метки времени являются внутренними значениями, поддерживаемыми в SQL Server. Они не соответствуют реальным датам и времени.

В SQL Server 7.0 введены два новых типа данных, которые более подробно будут рассмотрены в последующих публикациях. тип данных уникальный идентификатор (uniqueidentifier) позволяет присвоить столбцу уникальное в глобальном масштабе значение. Глобальная уникальность означает неповторимость не только в рамках конкретной базы данных или в пределах одного компьютера, но вообще везде. Этот тип данных играет важную роль при работе с хранилищами данных, когда информация собирается в него из множества разнообразных источников. Тип данных курсор (cursor) применяется для переменных курсора. Использование курсора — отдельная большая тема, которой автор собирается посвятить целую статью.

SQL Server позволяет пользователям определять собственные типы данных, которые являются комбинацией системных типов данных. Как правило, они базируются на системном типе данных определенной длины (имеются в виду числовые и символьные значения), для которого назначаются правила и значения по умолчанию. Например, можно определить тип данных Почтовый индекс как char(10), а тип данных Телефонный номер как char(14). Тогда тип данных Почтовый индекс будет гарантировать целостность форматов почтовых индексов во всех столбцах, для любого клиента, поставщика, служащего или контактного лица где угодно по всему миру.

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

На данный момент добавлять новые типы данных можно с помощью SQL Server Enterprise Manager или из анализатора запросов Query Analyzer (в версии SQL Server 6.5 это производится из окна ISQL/w). Каждый тип данных, который добавляют пользователи, действует только в пределах конкретной базы данных. Если же необходимо создать тип данных для всех баз, то его следует поместить в базу данных моделей Model. С момента создания в этой базе данных новый тип данных будет доступен во всех остальных базах. Существует другой способ решения этой проблемы — написать сценарий или сгенерировать его с помощью утилиты генерации сценариев Generate SQL Script, входящей в состав SQL Server. Тогда этот сценарий можно будет запускать из любой базы данных. В Enterprise Manager следует дважды щелкнуть правой кнопкой мыши на названии базы данных, а затем последовательно выбрать из меню Все задачи (All tasks), Генерировать сценарий SQL (Generate SQL Script) и наконец, выбрать пункт создания сценария для всех типов данных.

В окне Enterprise Manager следует выбрать пункт Базы данных (Databases), выбрать конкретную базу из списка, а затем перейти к пункту Определяемые пользователем типы данных (User-Defined Data Types). Щелкните правой кнопкой мыши и выберите пункт Свойства новых определяемых пользователем типов данных (New User-defined Datatype Properties). После этого приступайте к определению типа данных.

Как принято в SQL Server, добавить новый тип данных можно также с помощью анализатора запросов Query Analyzer. Обратите внимание на то, что кавычки заключают название системного типа данных, но вокруг названия вновь создаваемого типа данных их не ставят. Кроме того, полезно сразу указать, допускает ли создаваемый тип данных неопределенные значения. Для конкретного столбца можно будет в последующем переопределить эту установку, но первоначальная спецификация допустимых возможностей облегчает введение стандартов. А это и является той целью, ради которой вводятся новые типы данных.

При определении типов данных оператор создания таблицы может выглядеть так, как показано на листинге 2. Для тех столбцов, к которым применяются определенные пользователем типы данных, не требуется указывать длину помещаемых в него сведений, — ведь она уже была определена при создании типа данных. Можно также не сообщать системе о том, допустимы ли в рассматриваемом столбце неопределенные значения, поскольку это задано в спецификации типа данных. Хотя не повредит включить такое упоминание и в этот оператор.

Правильный подбор типов данных является частью проектирования таблицы. В SQL Server 6.5 очень трудно изменить свойства столбца после того, как он был создан. В версии SQL Server 7.0 это возможно, но проводить такую процедуру следует с крайней осторожностью.

Введение определяемых пользователем типов данных является одним из способов обеспечения целостности информации в различных приложениях, над которыми трудятся разные команды разработчиков. При этом предполагается , что все они используют SQL Server. Однако при перенесении кода SQL в другие СУБД целесообразно избегать применения определяемых пользователем типов данных.

Майкл Д. Рейли ([email protected]) является одним из основателей и вице президентом компании Mount Vernon Data Systems, которая занимается консалтингом по Windows NT и SMS, а также разработкой приложений,широко использующих базы данных. Он обладает сертификатами MCSE и MCT по Windows NT, SQL Server и SMS.

au_id varchar(11) NOT NULL ,
aulname varchar (40) NOT NULL ,
au_fname varchar (20) NOT NULL ,
phone char (12) NOT NULL ,
address varchar (40) NULL ,
city varchar (20) NULL ,
state char (2) NULL ,
zip char (5) NULL ,
contract bit NOT NULL)
SP_ADDTYPE id, `char(11)`, `not null`
GO
SP_ADDTYPE phonenumber, `char(12)`, `not null`
GO
SP_ADDTYPE statecode, `char(2)`, `null`
GO
SP_ADDTYPE zipcode, `char(10)`, `null`
GO

CREATE TABLE dbo. authors (
     au_id id NOT NULL ,
     au_lname varchar (40) NOT NULL ,
     au_fname varchar (20) NOT NULL ,
     phone phonenumber(12) ,
     address varchar (40) NULL ,
     city varchar (20) NULL ,
     state statecode,
     zip zipcode,
     contract bit NOT NULL )

Типы данных — Oracle PL/SQL •MySQL •MariaDB •SQL Server •SQLite

Ниже приведен список типов данных, доступных в Oracle/PLSQL, который включает в себя символьные, числовые, дата/время, булевы LOB, RowId типы данных.

Символьные типы данных

Ниже перечислены символьные типы данных в Oracle/PLSQL:

Типы данныхРазмерОписание
char(размер)Максимальный размер 2000 байт.Где размер — количество символов фиксированной длины. Если сохраняемое значение короче, то дополняется пробелами; если длиннее, то выдается ошибка.
nchar(размер)Максимальный размер 2000 байт.Где размер — количество символов фиксированной длины в кодировке Unicode. Если сохраняемое значение короче, то дополняется пробелами; если длиннее, то выдается ошибка.
nvarchar2(размер)Максимальный размер 4000 байт.Где размер – количество сохраняемых символов в кодировке Unicode переменной длины.
varchar2(размер)Максимальный размер 4000 байт. Максимальный размер в PLSQL 32KB.Где размер – количество сохраняемых символов переменной длины.
longМаксимальный размер 2GB.Символьные данные переменной длины.
rawМаксимальный размер 2000 байт.Содержит двоичные данные переменной длины
long rawМаксимальный размер 2GB.Содержит двоичные данные переменной длины

Применение: Oracle 9i, Oracle 10g, Oracle 11g, Oracle 12c

Числовые типы данных

Ниже приведены числовые типы данных в Oracle/PLSQL:

Типы данныхРазмерОписание
number(точность,масштаб)Точность может быть в диапазоне от 1 до 38.
Масштаб может быть в диапазоне от -84 до 127.
Например,number (14,5) представляет собой число, которое имеет 9 знаков до запятой и 5 знаков после запятой.
numeric(точность,масштаб)Точность может быть в диапазоне от 1 до 38. Например, numeric(14,5) представляет собой число, которое имеет 9 знаков до запятой и 5 знаков после запятой.
dec(точность,масштаб)Точность может быть в диапазоне от 1 до 38.Например, dec (5,2) — это число, которое имеет 3 знака перед запятой и 2 знака после .
decimal(точность,масштаб)Точность может быть в диапазоне от 1 до 38.Например, decimal (5,2) — это число, которое имеет 3 знака перед запятой и 2 знака после .
PLS_INTEGERЦелые числа в диапазоне от -2,147,483,648 до
2,147,483,647
Значение PLS_INTEGER требуют меньше памяти и быстрее значений NUMBER

Применение: Oracle 9i, Oracle 10g, Oracle 11g, Oracle 12c

Дата/время типы данных

Ниже приведены типы данных дата/время в Oracle/PLSQL:

Типы данныхРазмерОписание
datedate может принимать значения от 1 января 4712 года до н. э. до 31 декабря 9999 года нашей эры.

Применение: Oracle 9i, Oracle 10g, Oracle 11g, Oracle 12c

Большие объекты (LOB) типы данных

Ниже перечислены типы данных LOB в Oracle/PLSQL:

Типы данныхРазмерОписание
bfileМаксимальный размер файла 4 ГБ.Файл locators, указывает на двоичный файл в файловой системе сервера (вне базы данных).
blobХранит до 4 ГБ двоичных данных.Хранит неструктурированные двоичные большие объекты.
clobХранит до 4 ГБ символьных данных.Хранит однобайтовые и многобайтовые символьные данные.
nclobХранит до 4 ГБ символьных текстовых данных.Сохраняет данные в кодировке unicode.

Применение: Oracle 9i, Oracle 10g, Oracle 11g, Oracle 12c

Rowid тип данных

Ниже перечислены типы данных Rowid в Oracle/PLSQL:

Типы данныхФорматОписание
rowidФормат строки: BBBBBBB.RRRR.FFFFF,Где BBBBBBB — это блок в файле базы данных; RRRR — строка в блоке; FFFFF — это файл базы данных.Двоичные данные фиксированной длины. Каждая запись в базе данных имеет физический адрес или идентификатор строки (rowid).

Булевы (BOOLEAN) типы данных

Типы данныхФорматОписание
BOOLEAN TRUE или FALSE. Может принимать значение NULLХранит логические значения, которые вы можете использовать в логических операциях.

Применение: Oracle 9i, Oracle 10g, Oracle 11g, Oracle 12c

sql-server — Следует ли вам выбирать типы данных MONEY или DECIMAL (x, y) в SQL Server?

Ну, мне нравится MONEY! Это на байт дешевле, чем DECIMAL, и вычисления выполняются быстрее, потому что (под прикрытием) операции сложения и вычитания по сути являются целочисленными операциями. Пример @ SQLMenace, который является отличным предупреждением для незнающих, может в равной степени применяться к INTegers, где результат будет нулевым. Но это не причина не использовать целые числа — при необходимости .

Таким образом, совершенно «безопасно» и целесообразно использовать MONEY, когда вы имеете дело с MONEY, и использовать его в соответствии с математическими правилами, которым он следует (так же, как INTeger).

Было бы лучше, если бы SQL Server способствовал делению и умножению MONEY на DECIMALs (или FLOATs?) — возможно, но они не решили этого делать; и при этом они не решили повышать INTegers до FLOATs при их разделении.

MONEY не имеет проблем с точностью; то, что DECIMALs позволяет иметь больший промежуточный тип, используемый во время вычислений, является просто «особенностью» использования этого типа (и я на самом деле не уверен, насколько далеко распространяется эта «особенность»).

Чтобы ответить на конкретный вопрос, «веская причина»? Что ж, если вам нужна абсолютная максимальная производительность в SUM(x), где x может быть DECIMAL или MONEY, тогда MONEY будет иметь Edge.

Кроме того, не забывайте, что это двоюродный брат меньшего размера, SMALLMONEY — всего 4 байта, но он максимально работает с 214,748.3647 — что довольно мало за деньги — и поэтому не всегда подходит.

Чтобы доказать смысл использования промежуточных типов большего размера, если вы явно присваиваете промежуточное значение переменной, DECIMAL сталкивается с той же проблемой:

declare @a decimal(19,4)
declare @b decimal(19,4)
declare @c decimal(19,4)
declare @d decimal(19,4)

select @a = 100, @b = 339, @c = 10000

set @d = @a/@b

set @d = @d*@c

select @d

Создает 2950. 0000 (хорошо, поэтому по крайней мере DECIMAL округляется, а не MONEY усекается — то же самое, что и целое число).

Научитесь использовать тип данных SQL Server DECIMAL

Используйте тип данных SQL Server DECIMAL для определения столбцов с фиксированной точностью и масштабом. В отличие от FLOAT, тип данных DECIMAL имеет фиксированные десятичные разряды. Для определения типа используйте ключевые слова типа данных DECIMAL и NUMERIC как взаимозаменяемые.

 DECIMAL (точность , шкала ) 

При определении тип данных DECIMAL обеспечивает как точность , так и шкалу .

Точность определяет общее количество десятичных цифр для хранения в числе.Сюда входят цифры слева и справа от десятичной дроби.

Шкала определяет общее количество десятичных цифр справа от десятичной. Масштаб — это значение от 0 до точности.

Вычтите шкалы из точности , чтобы найти количество цифр слева от десятичной точки.

Пример типа данных DECIMAL SQL SERVER

Запутались? Посмотрите на эту диаграмму, она помогает!

Как видите, DECIMAL (10,4) определяет число, содержащее всего десять цифр, четыре из которых находятся справа от десятичного разряда.Отсюда следует, что слева есть шесть.

Примеры использования DECIMAL

Рассмотрим пример использования типа данных SQL Server DECIMAL в таблице Production.Product. Будем работать со столбцом «Вес».

Обратите внимание, что его тип — DECIMAL (8,2), что означает, что есть два десятичных знака в пределах восьми цифр. Он может хранить этот номер: 123456.21, но не 7654321.12

.

Вы запрашиваете этот тип, как любое другое числовое поле. Вот как:

SELECTProductID ,[Имя] ,[Масса] ОТПроизводство.Товар где [вес] не равен нулю

 SELECTProductID
,[Имя]
,[Масса]
FROMProduction. Product
где [вес] не равен нулю 

Дополнительные ресурсы

Чтобы узнать больше о числовых типах SQL, ознакомьтесь с этими полезными ресурсами:

12.22.2 Характеристики типа данных DECIMAL

12.22.2 Характеристики типа данных DECIMAL

В этом разделе обсуждаются характеристики DECIMAL тип данных (и его синонимы), уделяя особое внимание следующим темам:

Синтаксис объявления для DECIMAL столбец ДЕСЯТИЧНЫЙ ( M , D ) .Диапазоны значений аргументов следующие:

  • M — максимальное количество цифр (точность). Диапазон значений от 1 до 65.

  • D — количество цифр в справа от десятичной точки (шкала). Имеет диапазон от 0 до 30 и не должен превышать M .

Если D опущено, значение по умолчанию — 0.Если M опущено, по умолчанию 10.

Максимальное значение 65 для M означает что вычисления на DECIMAL значениях имеют точность до 65 цифр. Этот предел в 65 знаков точности также применяется к числовым литералам с точным значением, поэтому максимальный диапазон таких литералов отличается от предыдущих. (Существует также ограничение на как долго текст DECIMAL литералы могут быть; видеть Раздел 12.22.3, «Обработка выражений».)

Значения для столбцов DECIMAL являются хранится с использованием двоичного формата, который упаковывает девять десятичных цифр в 4 байтов. Требования к хранению для целых и дробных части каждой стоимости определяются отдельно. Каждое кратное для девяти цифр требуется 4 байта, а любые оставшиеся цифры остаются требуется некоторая часть в 4 байта. Хранилище, необходимое для остальные цифры приведены в следующей таблице.

Оставшиеся цифры Количество байтов
0 0
1-2 1
3–4 2
5–6 3
7–9 4

Например, в столбце DECIMAL (18,9) девять цифры по обе стороны от десятичной точки, поэтому целая часть и дробная часть требует 4 байта.А DECIMAL (20,6) столбец имеет четырнадцать целых чисел цифры и шесть цифр после дробной части. Целые цифры требуют четырех байты для девяти цифр и 3 байта для оставшихся пяти цифры. Для шести цифр дробной части требуется 3 байта.

DECIMAL столбцы не хранят ведущий + символа или - символ или ведущие 0 цифры. Если вы вставите +0003.1 в DECIMAL (5,1) столбец, он хранится как 3.1 . Для отрицательных числа, буквальный символ - не сохраняется.

DECIMAL столбцы не допускают значения больше, чем диапазон, подразумеваемый определением столбца. Для Например, столбец DECIMAL (3,0) поддерживает диапазон с -999 до 999 . А ДЕСЯТИЧНЫЙ ( M , D ) столбец допускает до M D цифр слева от десятичной дроби точка.

Стандарт SQL требует, чтобы точность НОМЕР ( M , D ) быть ровно M цифры. Для ДЕСЯТИЧНЫЙ ( M , D ) , стандарт требует точности не менее M цифр, но позволяет и больше. В MySQL ДЕСЯТИЧНЫЙ ( M , D ) а также НОМЕР ( M , D ) одинаковы, и оба имеют точность точно M цифр.

Для полного объяснения внутреннего формата DECIMAL значения, см. Файл строки / decimal.c в источнике MySQL распределение. Формат поясняется (с примером) в decimal2bin () функция.

Decimal vs Double в SQL

Введение

Postgresql поддерживает широкий спектр собственных типов данных. Среди них текстовые типы данных, числовые типы данных, дата и время, логический тип данных и т. Д.Создание типов данных в Postgresql легко выполняется с помощью команды CREATE TYPE. В этой статье мы сосредоточимся на двух типах данных; десятичный и двойной типы данных. Эти два типа данных относятся к числовым типам данных. Разницу между этими двумя типами можно рассматривать с точки зрения размера памяти и точности — количества цифр, которое может содержать число, включая цифры справа и слева от десятичной точки. Без лишних слов, давайте перейдем к десятичным и двойным в SQL и узнаем больше.

Десятичный тип

Тип данных DECIMAL принимает два аргумента, десятичный (p, s), где p — максимальное количество хранимых цифр от 1 до 13 1072, s — количество хранимых цифр справа от десятичной точки.

Практические примеры использования десятичных знаков

00 21 $ CREATE TABLE десятичное_значение (
id СЕРИЙНЫЙ НОМЕР,
item VARCHAR (50) NOT NULL,
VALUE DECIMAL (13, 2) NOT NULL,
PRIMARY KEY (id)
);
СОЗДАТЬ ТАБЛИЦУ

$ INSERT INTO decimal_values ​​(элемент, VALUE) VALUES (‘Test Item’, 12. 35);
INSERT 0 1
$ INSERT INTO decimal_values ​​(элемент, VALUE) VALUES (‘Test Item’, 1012.305);
INSERT 0 1
$ INSERT INTO decimal_values ​​(элемент, VALUE) VALUES (‘Test Item’, 1212.3894);
INSERT 0 1
$ SELECT * FROM decimal_values;

id | пункт | ЗНАЧЕНИЕ
—- + ———— + ——-
1 | Тестовый элемент | 12.35
2 | Тестовый элемент | 1012.31
3 | Тестовый элемент | 1212,39

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

Двойной тип

Типы Double используются, когда мы не уверены в поведении наших данных.Входные данные интерпретируются как целые числа с плавающей запятой. Некоторые данные могут занимать больше цифр справа от десятичной точки. В то время как размер хранилища десятичного типа является переменным, тип double занимает 8 байтов. Также двойная точность может достигать пятнадцати десятичных цифр.

Практические примеры использования двойного

1
2
3
4
5
6
7
8
9
10
11
12
13
14

$ СОЗДАТЬ ТАБЛИЦУ double_values ​​(
id СЕРИЙНЫЙ НОМЕР,
item VARCHAR (50) NOT NULL,
VALUE DOUBLE PRECISION,
PRIMARY KEY (id)
);
СОЗДАТЬ ТАБЛИЦУ

$ INSERT INTO double_values ​​(item, VALUE) VALUES (‘Test Item’, 1532.3985);
INSERT 0 1
$ INSERT INTO double_values ​​(item, VALUE) VALUES (‘Test Item’, 12312.3559023);
INSERT 0 1
$ INSERT INTO double_values ​​(item, VALUE) VALUES (‘Test Item’, 11935.372014);
ВЫБРАТЬ * ИЗ double_values;

Заключение

Мы надеемся, что эта статья устранила вашу путаницу в различии между десятичными и двойными типами данных в SQL. Мы объяснили, когда использовать каждый тип, а также показали примеры того, как указать каждый тип вместе с необходимыми им параметрами.Потратьте некоторое время на то, чтобы заранее подумать о своих данных и с умом выбрать типы данных, потому что в долгосрочной перспективе это принесет дивиденды.

Если вам нужен кто-то, кому вы доверяете, для управления Postgres, CockroachDB или Redis, не стесняйтесь обращаться к нам в Object Rocket. Мы всегда рады помочь вам с вашими потребностями в базе данных. Мы не только обрабатываем базы данных SQL, но также управляем базами данных NoSQL, такими как MongoDB.

Тип данных

SQL Money: что это такое? А как насчет десятичного числа?

Это много денег

Джереми Хиллпот

Тип данных MONEY в SQL Server получает плохую репутацию.Спросите нескольких людей, использовать ли его, и они, вероятно, скажут:

  • «Тип данных MONEY неверен и не должен использоваться».
  • «Тип данных MONEY может привести к непреднамеренной потере точности из-за ошибок округления. Лучше использовать тип данных DECIMAL».

Учитывая эти общие мнения, возникает соблазн полностью отказаться от типа данных MONEY и использовать вместо него тип данных DECIMAL. Это достойный совет, поскольку тип данных DECIMAL не связан с проблемами неточности данных, а тип данных DECIMAL может делать все, что может тип данных MONEY.Однако бывают случаи, когда ДЕНЬГИ полезны и уместны.

MONEY vs. DECIMAL: предыстория и история

На заре SQL Server тип данных DECIMAL предлагал гибкость, поскольку его можно было использовать для сохранения большинства чисел. Однако для DECIMAL требовалось много места для хранения ( 17 байт, ). С типом данных MONEY (он же NUMERIC) количество цифр после десятичного разряда было ограничено до четырех — например, 12345,6789 — поэтому требования к хранилищу были меньше ( 8 байтов ).Таким образом, ДЕНЬГИ пригодились, когда вы хотели сэкономить на хранилище.

ДЕНЬГИ будет по-прежнему сэкономить место, если вы не используете SQL Server Enterprise Edition. С другой стороны, если вы используете корпоративную версию, последующие обновления SQL Server означают, что это соглашение к вам не применимо.

SQL Server 2005, пакет обновления 2:

В выпуске пакета обновления 2 SQL Server 2005 введено хранилище vardecimal для типа данных DECIMAL. Это изменило пространство для хранения, необходимое для DECIMAL, в результате чего оно зависело от количества цифр.В результате типу данных DECIMAL может потребоваться 5 , 9 , 13 или 17 байтов для хранения — в зависимости от размера сохраняемого числа.

Используя vardecimal для ограничения числа до 4 цифр после десятичной дроби — точно так же, как MONEY ограничено до 4 — пользователи могут уменьшить требования к хранилищу для типа данных DECIMAL до 5 байтов для чисел до 429496.7296 . Для больших чисел требования к хранилищу увеличились, но если ваши числа упали в этот порог 429496.7296 , вы можете сэкономить много места с помощью DECIMAL и vardecimal. Кроме того, ограничившись двумя цифрами после десятичной дроби, вы можете сохранить числа до 42949672,96 с 5 байтами пространства.

SQL Server 2018:

В SQL Server 2018 использование сжатия строк стало стандартом для DECIMAL и заменило использование vardecimal. Сжатие строк также позволяет сохранять ДЕСЯТИЧНЫЕ числа с меньшим пространством, чем ДЕНЬГИ, и это делает функции экономии места vardecimal спорными.

В конечном итоге, если вы не являетесь пользователем SQL Server Enterprise Edition, ни одно из этих обновлений к вам не применимо. Тип данных MONEY по-прежнему экономит место для хранения из-за требований 8-байт по сравнению с требованием DECIMAL 17-байтов .

Означает ли это, что пользователи, не являющиеся корпоративными, должны по-прежнему выбирать ДЕНЬГИ, чтобы сэкономить на хранилище? Ответ на этот вопрос зависит от типа транзакций, которые вы будете выполнять с данными, и от того, насколько важна для вас точность данных.

Тип данных MONEY и непреднамеренная потеря точности

Экономия места для хранения важна — особенно для массивных баз данных SQL — но точность ваших данных намного важнее. Если вы планируете использовать тип данных MONEY для экономии места в выпуске SQL Server, отличном от корпоративного, помните, что вычисления умножения и деления с типом данных MONEY могут вызвать ошибки округления, которые приведут к непреднамеренной потере точности.

Вот почему умножение и деление — проблема с ДЕНЬГАМИ:

  • ДЕНЬГИ сохраняет только числовую информацию до четвертого десятичного знака.
  • Если в результате вычислений умножения или деления получается целое число с точностью до пятого десятичного знака, ДЕНЬГИ округлит его, что приведет к ошибке точности.
  • Хотя отдельные расчеты могут не сильно отличаться, чем больше вычислений вы выполняете, тем более неточными становятся результаты, что создает возможность для снежного кома неточной информации.

Вычисления сложения и вычитания не являются проблемой для ДЕНЬГИ, поэтому, если это все, что вам нужно — и вы не являетесь корпоративным пользователем SQL Server — данные ДЕНЬГИ помогут вам сэкономить место.В противном случае используйте DECIMAL вместо MONEY. DECIMAL не сокращает числа из-за ошибки округления, поэтому вы умножаете и делите целое число и тем самым поддерживаете точность ваших вычислений.

Представьте, что вы отслеживаете банковскую информацию, связанную с чековыми депозитами:

В качестве примера того, насколько это важно, представьте, что вы — служба, которая отслеживает данные и записи, связанные с чековыми депозитами вашего клиента, например CheckDeposit.io, которая управляет записями о чековых депозитах клиентов для любого банка (например, CheckDeposit.io).грамм. Wells Fargo, Bank of America), сохраняя каждую квитанцию ​​о депозите, изображение чека и изображение денежного перевода. Это простое и понятное решение для ведения учета, которое также обеспечивает сложные вычисления, аналитику и аналитику этих записей, поэтому точность данных имеет первостепенное значение.

Хотя CheckDeposit.io имеет дело с записями, относящимися к «деньгам», тип данных MONEY не будет работать, потому что — как только они применяют вычисление умножения или деления к данным — он искажает результаты.

Доллары и центы

Что следует использовать: тип данных MONEY или тип данных DECIMAL?

Учитывая все, что мы только что обсудили, вот когда вам следует использовать тип данных MONEY по сравнению с типом данных DECIMAL в SQL Server:

  • Вы не являетесь корпоративным пользователем SQL Server, не планируете выполнять вычисления умножения и деления, и вам нужно сэкономить место? Тип данных MONEY сократит ваши требования к хранилищу. Также, если ни одна из ваших цифр не превышает 214 748.3647, тип данных SMALLMONEY позволит сэкономить еще больше места.
  • Вы не являетесь корпоративным пользователем SQL и нуждаетесь в вычислениях умножения и деления или просто не беспокоитесь об экономии места для хранения? Избегайте угрозы ошибок округления и непреднамеренной потери точности, используя тип данных DECIMAL.
  • Вы используете SQL Server Enterprise Edition? Нет причин использовать тип данных MONEY, если вы планируете использовать SQL Server Enterprise Edition.Поддерживайте точность вычислений с помощью типа данных DECIMAL и экономьте место с помощью функции сжатия строк , представленной в SQL Server 2008.

SQLBot: легкое решение для автоматизации ваших SQL-запросов

К настоящему времени вы должны иметь полное представление о том, когда использовать MONEY или DECIMAL для наиболее точных записей в базе данных. Конечно, с нашей стороны это SQL 101, поскольку SQLBot помогает вам более эффективно управлять, запрашивать и делиться информацией о вашей базе данных.

SQLBot — это простой и легкий сервис, который позволяет заранее планировать SQL-запросы. Он передает результаты запроса вашей команде через Slack и по электронной почте на автопилоте. Если у вас есть запрос, который вы выполняете ежедневно, еженедельно или ежемесячно — и вы должны делиться результатами со своей командой, — SQLBot автоматизирует процесс, чтобы вы могли сосредоточиться на других задачах.

Настройте, забудьте об этом.

Получайте нужные метрики каждый раз вовремя. Попробуйте SQLBot прямо сейчас. Это бесплатно!

* Фотография предоставлена: Фото Nina P на Reshot

Справочник по типам данных SQL Server

Этот лист содержит простой справочник для поиска ограничений и преимуществ для каждого типа данных SQL Server.В SQL Server существует множество типов данных sql. Знание ограничений и преимуществ каждого типа данных sql скоро окупится.

Пример преимуществ

Выбор типа данных sql tinyint вместо int для столбца «ProductType» со значениями от 1 до 10 позволит сэкономить три байта на запись. Со 100 000 записей вы сэкономите 300 000 байт. Это не так много с точки зрения дискового пространства («хранилище дешево и т. Д.»), Но у вас, вероятно, будут индексы, содержащие этот столбец , и если этот индекс занимает меньше памяти , ядро ​​базы данных будет обрабатывать этот индекс намного эффективнее в каждом «присоединиться» и «где» и т. д.

Таким образом, запросы будут выполнять быстрее , снимут блокировки раньше (если есть) и будут использовать меньше системных ресурсов (память и ЦП). Это улучшит работу всего сервера, поскольку будет доступно больше ресурсов для других целей.

Если вы изучите доступные типы данных sql и потратите несколько дополнительных минут на разработку схемы, это приведет к более быстрому выполнению запроса и общей более производительной базе данных.

Типы данных SQL

Справочный лист

Столбцы с именами 8, 9, 10 и 11 указывают на поддержку типа данных версии SQL Server, где

  • 8 = SQL Server 2000
  • 9 = SQL Server 2005
  • 10 = SQL Server 2008
  • 11 = SQL Server 2012

Примечание о точности

Пространство, занимаемое записями значений типов, определяющих точность (Float, Decimal, DateTime2 и т. Д.), Всегда одинаково.Это определение столбца, которое определяет, сколько места занимает каждая запись, а не размер самого значения. Таким образом, десятичное (25,5) значение 999.999 занимает 13 байтов, а не 5 байтов. Даже значение NULL займет 13 байтов. Столбец фиксированной длины. Несмотря на то, что это может показаться плохим, при работе с данными фиксированной длины производительность ЦП увеличивается (также помните, что деревья индексов содержат эти значения и требования к хранилищу фиксированной длины).

Еще одно соображение заключается в том, что при суммировании значения на основе точности тип данных результирующих суммированных значений будет таким же (если не приведен), что и определение столбца, и может произойти арифметическое переполнение.Если вы знаете, что ваши значения будут, например, находиться в диапазоне от 0 до 999,99, с точки зрения пространства нет смысла не определять его как Decimal (9,2) в любом случае (определение наивысших 5 байтов). Таким образом, у вашего итогового результата будет больше свободного места, и вы, возможно, сможете избежать некоторых кастингов. С точки зрения ограничений Decimal (5,2) может быть более подходящим, но, возможно, требования ограничений не следует путать с решениями о типах данных (ну, это еще одно обсуждение, выходящее за рамки этой статьи).

Мой лучший совет — «Определите свою точность как высшую точку, прежде чем требования к хранилищу увеличатся» .

Сводка

Потратьте некоторое время на изучение этих типов данных sql. Правильно используемые типы данных sql улучшат производительность, сэкономят место на диске и сократят время резервного копирования. Это также поможет обеспечить последовательную структуру. Выбор типов данных sql действительно является важной частью ограничения схемы базы данных и сообщения о предполагаемом использовании.

Справочные листы типов данных для конкретных версий

Справочный лист по типам данных SQL Server был извлечен в конкретных версий листов. Они находятся в следующих местах: SQL Server 2012, SQL Server 2008, SQL Server 2005 и SQL Server 2000.

Общие сведения о типах данных SQL Server

В следующих разделах описаны типы данных, поддерживаемые SQL Server.

Типы данных SQL Server

Типы данных, поддерживаемые Microsoft SQL Server, можно разделить на три основные категории: строковые, числовые и типы данных даты / времени.

Строковые типы данных

Строковые типы данных обычно используются для хранения имен, адресов, описаний или любых значений, содержащих буквы и цифры, включая двоичные данные, например изображения или аудиофайлы.

Тип данных Описание
симв. ( n ) Хранит символьную строку фиксированной длины.Максимальная длина 8000 символов.
varchar ( n ) Хранит символьную строку переменной длины. Максимальная длина 8000 символов.
varchar (макс.) Хранит символьную строку переменной длины. Здесь max указывает, что максимальный размер хранилища составляет 2 ГБ.
текст Хранит символьную строку переменной длины.Максимальный размер хранилища — 2 ГБ.
nchar Хранит строку Unicode фиксированной длины. Максимальная длина 4000 символов.
nvarchar Хранит строку Unicode переменной длины. Максимальная длина 4000 символов.
nvarchar (макс.) Хранит строку Unicode переменной длины. Здесь max указывает, что максимальный размер хранилища составляет 2 ГБ.
ntext Хранит строку Unicode переменной длины. Максимальный размер хранилища — 2 ГБ.
двоичный ( n ) Хранит двоичные данные фиксированной длины. Максимальный размер хранилища — 8000 байт.
varbinary ( n ) Хранит двоичные данные переменной длины. Максимальный размер хранилища — 8000 байт.
varbinary (макс.) Хранит двоичные данные переменной длины. Здесь max указывает, что максимальный размер хранилища составляет 2 ГБ.
изображение Хранит двоичные данные переменной длины. Максимальный размер хранилища — 8000 байт.

Числовые типы данных

Числовые типы данных обычно используются для хранения таких данных, как цена, зарплата и т. Д.

Тип данных Описание
бит Позволяет сохранить значение 1, 0 или NULL .
tinyint Хранит целочисленные значения в диапазоне от 0 до 255.
smallint Хранит целочисленные значения в диапазоне от -32 768 до 32 767.
внутренний Хранит целочисленные значения в диапазоне от -2 147 483 648 до 2 147 483 647.
bigint Сохраняет целочисленные значения в диапазоне от -9,223,372,036,854,775,808 до 9,223,372,036,854,775,807.
десятичное ( p , s ) Хранит фиксированные числа точности и шкалы. 38 — 1. Подробнее см. Ниже.
числовой ( p , s ) Числовой тип данных функционально эквивалентен десятичному типу .
smallmoney Позволяет точно хранить денежные или валютные значения в диапазоне от -214 748,3648 до 214 748,3647.
деньги Позволяет точно хранить денежные или валютные значения в диапазоне от -922,337,203,685,477.5808 на 922 337 203 685 477 5807.
с плавающей запятой (n) Хранит числовые значения с плавающей запятой. Допустимые значения: от -1,79E + 308 до -2,23E-308, 0 и от 2,23E-308 до 1,79E + 308.
реальный Хранит числовые значения с плавающей запятой. Допустимые значения: от -3,40E + 38 до -1,18E - 38, 0 и 1,18E - 38 до 3,40E + 38.

При объявлении десятичного столбца или числовой можно указать точность и масштаб, например десятичный ( p , s ) или числовой ( p , s ) , где p или точность указывает максимальное общее количество цифр, которое может быть сохранено как слева, так и справа от десятичной точки.Точность должна быть от 1 до 38. Точность по умолчанию — 18.

Принимая во внимание, что s или шкала указывает максимальное количество цифр, которое может быть сохранено справа от десятичной точки. Это число вычитается из p , чтобы определить максимальное количество цифр слева от десятичной точки. Масштаб должен иметь значение от 0 до p. Масштаб по умолчанию — 0.

Например, в столбце десятичная цена (6,2) может храниться любое значение с шестью цифрами и двумя десятичными знаками i.е. в диапазоне от -9999,99 до 9999,99.


Типы данных даты и времени

Типы данных Date и Time обычно используются для хранения таких данных, как дата рождения, дата приема на работу, дата и время, когда запись создается или обновляется внутри таблицы и т. Д.

Тип данных Описание
дата Сохраняет значение даты в диапазоне от 0001-01-01 (1 января) до
9999-12-31 (31 декабря 9999).
время Сохраняет время суток с точностью до 100 наносекунд. Допустимые значения: от 00: 00: 00.0000000 до 23: 59: 59.9999999.
datetime Сохраняет комбинированное значение даты и времени с точностью до 3,33 миллисекунды. Допустимый диапазон дат для datetime : от 1753-01-01 (1 января 1753) до 9999-12-31 (31 декабря 9999).
datetime2 datetime2 является расширением типа данных datetime , который имеет больший диапазон дат.Допустимый диапазон дат для datetime2 : от 0001-01-01 (1 января) до 9999-12-31 (31 декабря 9999).
малое время Сохраняет комбинированное значение даты и времени с точностью до 1 минуты. Допустимый диапазон дат для smalldatetime : от 1900-01-01 (1 января 1900) до
2079-06-06 (6 июня 2079).
datetimeoffset То же, что и datetime2 с добавлением смещения часового пояса.Формат по умолчанию: ГГГГ-ММ-ДД чч: мм: сс [.nnnnnnn] [{+ | -} чч: мм] . Допустимый диапазон для смещения часового пояса от -14: 00 до +14: 00.
отметка времени В SQL Server отметка времени является синонимом типа данных rowversion , который автоматически генерирует уникальные двоичные числа в базе данных. Версия строки обычно используется для строк таблицы штампа версий.

Примечание: Каждый раз, когда строка со столбцом rowversion вставляется или изменяется внутри таблицы, увеличенное значение rowversion базы данных вставляется в столбец rowversion .Таблица может иметь только один столбец rowversion .

SQL Server: типы данных


Ниже приведен список типов данных, доступных в SQL Server (Transact-SQL), который включает строковые, числовые типы данных и типы данных даты / времени.

Строковые типы данных

Ниже приведены строковые типы данных в SQL Server (Transact-SQL):

Синтаксис типа данных Максимальный размер Пояснение
СИМВОЛ ( размер ) Максимальный размер 8000 символов. Где размер — количество символов для хранения. Фиксированная длина. Пробел заполнен справа до размера символов. Данные не в Юникоде.
VARCHAR ( размер ) или VARCHAR (макс.) Максимальный размер 8 000 или не более символов. Где размер — количество символов для хранения. Переменной длины. Если указано max , максимальное количество символов составляет 2 ГБ.Данные не в Юникоде.
ТЕКСТ Максимальный размер 2 ГБ. переменной длины. Данные не в Юникоде.
NCHAR ( размер ) Максимальный размер 4000 символов. Фиксированная длина. Данные Unicode.
NVARCHAR ( размер ) или NVARCHAR (макс.) Максимальный размер — 4000 или не более символов. Где размер — количество символов для хранения.Переменной длины. Если указано max , максимальное количество символов составляет 2 ГБ. Данные Unicode.
NTEXT Максимальный размер 1 073 741 823 байта. Переменная длина. Данные Unicode.
ДВОИЧНЫЙ ( размер ) Максимальный размер 8000 символов. Где размер — количество символов для хранения. Фиксированная длина. Пробел заполнен справа до размера символов.Двоичные данные.
VARBINARY ( размер ) или VARBINARY (макс.) Максимальный размер 8 000 или не более символов. Где размер — количество символов для хранения. Переменной длины. Если указано max , максимальное количество символов составляет 2 ГБ. Недвоичные данные.
ИЗОБРАЖЕНИЕ Максимальный размер 2 ГБ. Переменная длина. Двоичные данные.

Числовые типы данных

Ниже приведены числовых типов данных в SQL Server (Transact-SQL):

Синтаксис типа данных Максимальный размер Пояснение
БИТ Целое число, которое может быть 0, 1 или NULL.
TINYINT 0 до 255
МАЛЕНЬКИЙ-32768 до 32767
ИНТ -2 147 483 648 до 2 147 483 647
BIGINT -9,223,372,036,854,775,808 до 9,223,372,036,854,775,807
ДЕСЯТИЧНЫЙ ( м , d ) м по умолчанию 18, если не указано.
d по умолчанию 0, если не указано.
Где m — это общее количество цифр, а d — количество цифр после десятичной дроби.
DEC ( м , d ) м по умолчанию 18, если не указано.
d по умолчанию 0, если не указано.
Где m — это общее количество цифр, а d — количество цифр после десятичной дроби.

Это синоним типа данных DECIMAL.

ЧИСЛОВЫЙ ( m , d ) м по умолчанию 18, если не указано.
d по умолчанию 0, если не указано.
Где m — это общее количество цифр, а d — количество цифр после десятичной дроби.

Это синоним типа данных DECIMAL.

ПОПЛАВОК ( n ) Число с плавающей запятой.
n по умолчанию 53, если не указано иное.
Где n — количество битов для хранения в экспоненциальном представлении.
НАСТОЯЩИЙ Эквивалент FLOAT (24)
МАЛЕНЬКАЯ ДЕНЬ — 214 748,3648 до 214 748,3647
ДЕНЬГИ -922,337,203,685,477,5808 до 922,337,203,685,477,5807

Типы данных даты / времени

Ниже приведены типов данных даты / времени в SQL Server (Transact-SQL):

Синтаксис типа данных Максимальный размер Пояснение
(если есть)
ДАТА Диапазон значений от 0001-01-01 до 9999-12-31. Отображается как «ГГГГ-ММ-ДД»
ДАТА ВРЕМЯ Диапазон значений даты от «1753-01-01 00:00:00» до «9999-12-31 23:59:59».
Диапазон значений времени от ’00: 00: 00 ‘до ’23: 59: 59: 997’
Отображается как «ГГГГ-ММ-ДД чч: мм: сс [.ммм]»
DATETIME2 ( с точностью до долей секунды ) Диапазон значений даты от 0001-01-01 до 9999-12-31.
Диапазон значений времени от «00: 00: 00» до «23: 59: 59: 9999999».
Отображается как «ГГГГ-ММ-ДД чч: мм: сс [. Доли секунды]»
МАЛЕНЬКАЯ ВРЕМЯ Диапазон значений даты от «1900-01-01» до «2079-06-06».
Диапазон значений времени от «00: 00: 00» до «23: 59: 59».

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *