8.1. ЧиÑловÑе ÑипÑ
ЧиÑловÑе ÑÐ¸Ð¿Ñ Ð²ÐºÐ»ÑÑаÑÑ Ð´Ð²ÑÑ -, ÑеÑÑÑÑÑ - и воÑÑмибайÑнÑе ÑелÑе, ÑеÑÑÑÑÑ - и воÑÑмибайÑнÑе ÑиÑла Ñ Ð¿Ð»Ð°Ð²Ð°ÑÑей ÑоÑкой, а Ñакже деÑÑÑиÑнÑе ÑиÑла Ñ Ð·Ð°Ð´Ð°Ð²Ð°ÐµÐ¼Ð¾Ð¹ ÑоÑноÑÑÑÑ. ÐÑе ÑÑи ÑÐ¸Ð¿Ñ Ð¿ÐµÑеÑиÑÐ»ÐµÐ½Ñ Ð² ТаблиÑе 8.2.
ТаблиÑа 8.2. ЧиÑловÑе ÑипÑ
| ÐÐ¼Ñ | Ð Ð°Ð·Ð¼ÐµÑ | ÐпиÑание | Ðиапазон |
|---|---|---|---|
smallint | 2 байÑа | Ñелое в неболÑÑом диапазоне | -32768 .. +32767 |
integer | 4 байÑа | ÑипиÑнÑй вÑÐ±Ð¾Ñ Ð´Ð»Ñ ÑелÑÑ ÑиÑел | -2147483648 .. +2147483647 |
bigint | 8 Ð±Ð°Ð¹Ñ | Ñелое в болÑÑом диапазоне | -9223372036854775808 .. 9223372036854775807 |
decimal | пеÑеменнÑй | веÑеÑÑвенное ÑиÑло Ñ Ñказанной ÑоÑноÑÑÑÑ | до 131072 ÑиÑÑ Ð´Ð¾ деÑÑÑиÑной ÑоÑки и до 16383 â поÑле |
numeric | пеÑеменнÑй | веÑеÑÑвенное ÑиÑло Ñ Ñказанной ÑоÑноÑÑÑÑ | до 131072 ÑиÑÑ Ð´Ð¾ деÑÑÑиÑной ÑоÑки и до 16383 â поÑле |
real | 4 байÑа | веÑеÑÑвенное ÑиÑло Ñ Ð¿ÐµÑеменной ÑоÑноÑÑÑÑ | ÑоÑноÑÑÑ Ð² пÑÐµÐ´ÐµÐ»Ð°Ñ 6 деÑÑÑиÑнÑÑ ÑиÑÑ |
double precision | 8 Ð±Ð°Ð¹Ñ | веÑеÑÑвенное ÑиÑло Ñ Ð¿ÐµÑеменной ÑоÑноÑÑÑÑ | ÑоÑноÑÑÑ Ð² пÑÐµÐ´ÐµÐ»Ð°Ñ 15 деÑÑÑиÑнÑÑ ÑиÑÑ |
smallserial | 2 байÑа | неболÑÑое Ñелое Ñ Ð°Ð²ÑоÑвелиÑением | 1 .. 32767 |
serial | 4 байÑа | Ñелое Ñ Ð°Ð²ÑоÑвелиÑением | 1 .. 2147483647 |
bigserial | 8 Ð±Ð°Ð¹Ñ | болÑÑое Ñелое Ñ Ð°Ð²ÑоÑвелиÑением | 1 .. 9223372036854775807 |
СинÑакÑÐ¸Ñ ÐºÐ¾Ð½ÑÑÐ°Ð½Ñ ÑиÑловÑÑ Ñипов опиÑан в ÐодÑазделе 4.1.2. ÐÐ»Ñ ÑÑÐ¸Ñ Ñипов опÑеделÑн полнÑй Ð½Ð°Ð±Ð¾Ñ ÑооÑвеÑÑÑвÑÑÑÐ¸Ñ Ð°ÑиÑмеÑиÑеÑÐºÐ¸Ñ Ð¾Ð¿ÐµÑаÑоÑов и ÑÑнкÑий. Ðа дополниÑелÑнÑми ÑведениÑми обÑаÑиÑеÑÑ Ðº Ðлаве 9. ÐодÑобнее ÑÑи ÑÐ¸Ð¿Ñ Ð¾Ð¿Ð¸ÑÐ°Ð½Ñ Ð² ÑледÑÑÑÐ¸Ñ ÑÐ°Ð·Ð´ÐµÐ»Ð°Ñ .
8.1.1. ЦелоÑиÑленнÑе ÑипÑ
Ð¢Ð¸Ð¿Ñ smallint, integer и bigint Ñ
ÑанÑÑ ÑелÑе ÑиÑла, Ñо еÑÑÑ ÑиÑла без дÑобной ÑаÑÑи, имеÑÑие ÑазнÑе допÑÑÑимÑе диапазонÑ. ÐопÑÑка ÑоÑ
ÑаниÑÑ Ð·Ð½Ð°Ñение, вÑÑ
одÑÑее за Ñамки диапазона, пÑиведÑÑ Ðº оÑибке.
ЧаÑе вÑего иÑполÑзÑеÑÑÑ Ñип integer, как наиболее ÑбаланÑиÑованнÑй вÑÐ±Ð¾Ñ ÑиÑÐ¸Ð½Ñ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð°, ÑазмеÑа и бÑÑÑÑодейÑÑвиÑ. Тип smallint обÑÑно пÑименÑеÑÑÑ, ÑолÑко когда кÑайне важно ÑменÑÑиÑÑ ÑÐ°Ð·Ð¼ÐµÑ Ð´Ð°Ð½Ð½ÑÑ
на диÑке. Тип bigint пÑедназнаÑен Ð´Ð»Ñ ÑеÑ
ÑлÑÑаев, когда ÑиÑла не ÑмеÑаÑÑÑÑ Ð² диапазон Ñипа integer.
Ð SQL опÑÐµÐ´ÐµÐ»ÐµÐ½Ñ ÑолÑко ÑÐ¸Ð¿Ñ integer (или int), smallint и bigint. Ðмена Ñипов int2, int4 и int8 вÑÑ
одÑÑ Ð·Ð° Ñамки ÑÑандаÑÑа, Ñ
оÑÑ Ð¼Ð¾Ð³ÑÑ ÑабоÑаÑÑ Ð¸ в некоÑоÑÑÑ
дÑÑгиÑ
СУÐÐ.
8.1.2. ЧиÑла Ñ Ð¿ÑоизволÑной ÑоÑноÑÑÑÑ
Тип numeric позволÑÐµÑ Ñ
ÑаниÑÑ ÑиÑла Ñ Ð¾ÑÐµÐ½Ñ Ð±Ð¾Ð»ÑÑим колиÑеÑÑвом ÑиÑÑ. Ðн оÑобенно ÑекомендÑеÑÑÑ Ð´Ð»Ñ Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð´ÐµÐ½ÐµÐ¶Ð½ÑÑ
ÑÑмм и дÑÑгиÑ
велиÑин, где важна ÑоÑноÑÑÑ. ÐÑÑиÑÐ»ÐµÐ½Ð¸Ñ Ñ Ñипом numeric даÑÑ ÑоÑнÑе ÑезÑлÑÑаÑÑ, где ÑÑо возможно, напÑимеÑ, пÑи Ñложении, вÑÑиÑании и Ñмножении. Ðднако опеÑаÑии Ñо знаÑениÑми numeric вÑполнÑÑÑÑÑ Ð³Ð¾Ñаздо медленнее, Ñем Ñ ÑелÑми ÑиÑлами или Ñ Ñипами Ñ Ð¿Ð»Ð°Ð²Ð°ÑÑей ÑоÑкой, опиÑаннÑми в ÑледÑÑÑем Ñазделе.
Ðиже Ð¼Ñ Ð¸ÑполÑзÑем ÑледÑÑÑие ÑеÑминÑ: маÑÑÑаб знаÑÐµÐ½Ð¸Ñ numeric опÑеделÑÐµÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво деÑÑÑиÑнÑÑ
ÑиÑÑ Ð² дÑобной ÑаÑÑи, ÑпÑава Ð¾Ñ Ð´ÐµÑÑÑиÑной ÑоÑки, а ÑоÑноÑÑÑ â обÑее колиÑеÑÑво знаÑимÑÑ
ÑиÑÑ Ð² ÑиÑле, Ñ. е. колиÑеÑÑво ÑиÑÑ Ð¿Ð¾ обе ÑÑоÑÐ¾Ð½Ñ Ð´ÐµÑÑÑиÑной ÑоÑки. ÐапÑимеÑ, ÑиÑло 23.5141 Ð¸Ð¼ÐµÐµÑ ÑоÑноÑÑÑ 6 и маÑÑÑаб 4. ЦелоÑиÑленнÑе знаÑÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ ÑÑиÑаÑÑ ÑиÑлами Ñ Ð¼Ð°ÑÑÑабом 0.
ÐÐ»Ñ ÑÑолбÑа Ñипа numeric можно наÑÑÑоиÑÑ Ð¸ макÑималÑнÑÑ ÑоÑноÑÑÑ, и макÑималÑнÑй маÑÑÑаб. СÑÐ¾Ð»Ð±ÐµÑ Ñипа numeric обÑÑвлÑеÑÑÑ ÑледÑÑÑим обÑазом:
NUMERIC(ÑоÑноÑÑÑ,маÑÑÑаб)
ТоÑноÑÑÑ Ð´Ð¾Ð»Ð¶Ð½Ð° бÑÑÑ Ð¿Ð¾Ð»Ð¾Ð¶Ð¸ÑелÑной, а маÑÑÑаб положиÑелÑнÑм или ÑавнÑм нÑлÑ. ÐлÑÑеÑнаÑивнÑй ваÑианÑ
NUMERIC(ÑоÑноÑÑÑ)ÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ð¼Ð°ÑÑÑаб 0. ФоÑма:
NUMERIC
без ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ ÑоÑноÑÑи и маÑÑÑаба ÑоздаÑÑ ÑÑолбеÑ, в коÑоÑом можно ÑоÑ
ÑанÑÑÑ ÑиÑловÑе знаÑÐµÐ½Ð¸Ñ Ð»Ñбой ÑоÑноÑÑи и маÑÑÑаба в пÑеделаÑ
, поддеÑживаемÑÑ
ÑиÑÑемой. Ð ÑÑолбÑе ÑÑого Ñипа вÑ
однÑе знаÑÐµÐ½Ð¸Ñ Ð½Ðµ бÑдÑÑ Ð¿ÑиводиÑÑÑÑ Ðº какомÑ-либо маÑÑÑабÑ, Ñогда как в ÑÑолбÑаÑ
numeric Ñ Ñвно заданнÑм маÑÑÑабом знаÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´Ð³Ð¾Ð½ÑÑÑÑÑ Ð¿Ð¾Ð´ ÑÑÐ¾Ñ Ð¼Ð°ÑÑÑаб. (СÑандаÑÑ SQL ÑÑвеÑждаеÑ, ÑÑо по ÑмолÑÐ°Ð½Ð¸Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ ÑÑÑанавливаÑÑÑÑ Ð¼Ð°ÑÑÑаб 0, Ñ. е. знаÑÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¿ÑиводиÑÑÑÑ Ðº ÑелÑм ÑиÑлам. Ðднако Ð¼Ñ ÑÑиÑаем ÑÑо не оÑÐµÐ½Ñ Ð¿Ð¾Ð»ÐµÐ·Ð½Ñм. ÐÑли Ð´Ð»Ñ Ð²Ð°Ñ Ð²Ð°Ð¶Ð½Ð° пеÑеноÑимоÑÑÑ, вÑегда ÑказÑвайÑе ÑоÑноÑÑÑ Ð¸ маÑÑÑаб Ñвно.)
ÐÑимеÑание
ÐакÑималÑно допÑÑÑÐ¸Ð¼Ð°Ñ ÑоÑноÑÑÑ, коÑоÑÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ ÑказаÑÑ Ð² обÑÑвлении Ñипа, Ñавна 1000; еÑли же иÑполÑзоваÑÑ NUMERIC без ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ ÑоÑноÑÑи, дейÑÑвÑÑÑ Ð¾Ð³ÑаниÑениÑ, опиÑаннÑе в ТаблиÑе 8.2.
ÐÑли маÑÑÑаб знаÑениÑ, коÑоÑое нÑжно ÑÐ¾Ñ ÑаниÑÑ, пÑевÑÑÐ°ÐµÑ Ð¾Ð±ÑÑвленнÑй маÑÑÑаб ÑÑолбÑа, ÑиÑÑема окÑÑÐ³Ð»Ð¸Ñ ÐµÐ³Ð¾ до заданного колиÑеÑÑва ÑиÑÑ Ð¿Ð¾Ñле ÑоÑки. ÐÑли же поÑле ÑÑого колиÑеÑÑво ÑиÑÑ Ñлева в ÑÑмме Ñ Ð¼Ð°ÑÑÑабом пÑевÑÑÐ¸Ñ Ð¾Ð±ÑÑвленнÑÑ ÑоÑноÑÑÑ, пÑоизойдÑÑ Ð¾Ñибка.
ЧиÑловÑе знаÑÐµÐ½Ð¸Ñ ÑизиÑеÑки Ñ
ÑанÑÑÑÑ Ð±ÐµÐ· какиÑ
-либо дополнÑÑÑиÑ
нÑлей Ñлева или ÑпÑава. Таким обÑазом, обÑÑвлÑемÑе ÑоÑноÑÑÑ Ð¸ маÑÑÑаб ÑÑолбÑа опÑеделÑÑÑ Ð¼Ð°ÐºÑималÑнÑй, а не ÑикÑиÑованнÑй ÑÐ°Ð·Ð¼ÐµÑ Ñ
ÑанениÑ. (Ð ÑÑом ÑмÑÑле Ñип numeric болÑÑе поÑ
ож на Ñип varchar(, Ñем на n)char(.) ÐейÑÑвиÑелÑнÑй ÑÐ°Ð·Ð¼ÐµÑ Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ñакого знаÑÐµÐ½Ð¸Ñ ÑкладÑваеÑÑÑ Ð¸Ð· двÑÑ
Ð±Ð°Ð¹Ñ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ гÑÑÐ¿Ð¿Ñ Ð¸Ð· ÑеÑÑÑÑÑ
ÑиÑÑ Ð¸ дополниÑелÑнÑÑ
ÑÑÑÑ
-воÑÑми байÑ.n)
Ðомимо обÑÑнÑÑ
ÑиÑел Ñип numeric позволÑÐµÑ ÑоÑ
ÑаниÑÑ ÑпеÑиалÑное знаÑение NaN, ÑÑо ознаÑÐ°ÐµÑ Â«not-a-number» (не ÑиÑло). ÐÑÐ±Ð°Ñ Ð¾Ð¿ÐµÑаÑÐ¸Ñ c NaN вÑдаÑÑ Ð² ÑезÑлÑÑаÑе Ñоже NaN. ÐапиÑÑÐ²Ð°Ñ ÑÑо знаÑение в виде конÑÑанÑÑ Ð² команде SQL, его нÑжно заклÑÑаÑÑ Ð² апоÑÑÑоÑÑ, напÑÐ¸Ð¼ÐµÑ Ñак: UPDATE table SET x = 'NaN'. РегиÑÑÑ Ñимволов в ÑÑÑоке NaN не важен.
ÐÑимеÑание
РболÑÑинÑÑве ÑеализаÑий «не ÑиÑло» (NaN) ÑÑиÑаеÑÑÑ Ð½Ðµ ÑавнÑм лÑÐ±Ð¾Ð¼Ñ Ð´ÑÑÐ³Ð¾Ð¼Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ (в Ñом ÑиÑле и ÑÐ°Ð¼Ð¾Ð¼Ñ NaN). ЧÑÐ¾Ð±Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ numeric можно бÑло ÑоÑÑиÑоваÑÑ Ð¸ иÑполÑзоваÑÑ Ð² дÑевовиднÑÑ
индекÑаÑ
, PostgreSQL ÑÑиÑаеÑ, ÑÑо знаÑÐµÐ½Ð¸Ñ NaN ÑÐ°Ð²Ð½Ñ Ð´ÑÑг дÑÑÐ³Ñ Ð¸ пÑи ÑÑом болÑÑе лÑбÑÑ
ÑиÑловÑÑ
знаÑений (не NaN).
Ð¢Ð¸Ð¿Ñ decimal и numeric ÑавнознаÑнÑ. Ðба ÑÑи Ñипа опиÑÐ°Ð½Ñ Ð² ÑÑандаÑÑе SQL.
ÐÑи окÑÑглении знаÑений Ñип numeric вÑдаÑÑ ÑиÑло, болÑÑее по модÑлÑ, Ñогда как (на болÑÑинÑÑве плаÑÑоÑм) ÑÐ¸Ð¿Ñ real и double precision вÑдаÑÑ Ð±Ð»Ð¸Ð¶Ð°Ð¹Ñее ÑÑÑное ÑиÑло. ÐапÑимеÑ:
SELECT x, round(x::numeric) AS num_round, round(x::double precision) AS dbl_round FROM generate_series(-3.5, 3.5, 1) as x; x | num_round | dbl_round ------+-----------+----------- -3.5 | -4 | -4 -2.5 | -3 | -2 -1.5 | -2 | -2 -0.5 | -1 | -0 0.5 | 1 | 0 1.5 | 2 | 2 2.5 | 3 | 2 3.5 | 4 | 4 (8 rows)
8.1.3. Ð¢Ð¸Ð¿Ñ Ñ Ð¿Ð»Ð°Ð²Ð°ÑÑей ÑоÑкой
Ð¢Ð¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ
real и double precision Ñ
ÑанÑÑ Ð¿ÑиближÑннÑе ÑиÑловÑе знаÑÐµÐ½Ð¸Ñ Ñ Ð¿ÐµÑеменной ÑоÑноÑÑÑÑ. Ðа вÑеÑ
поддеÑживаемÑÑ
в наÑÑоÑÑее вÑÐµÐ¼Ñ Ð¿Ð»Ð°ÑÑоÑмаÑ
ÑÑи ÑÐ¸Ð¿Ñ ÑеализÑÑÑ ÑÑандаÑÑ IEEE 754 Ð´Ð»Ñ Ð´Ð²Ð¾Ð¸Ñной аÑиÑмеÑики Ñ Ð¿Ð»Ð°Ð²Ð°ÑÑей ÑоÑкой (Ñ Ð¾Ð´Ð¸Ð½Ð°Ñной и двойной ÑоÑноÑÑÑÑ ÑооÑвеÑÑÑвенно), в Ñой меÑе, в какой его поддеÑживаÑÑ Ð¿ÑоÑеÑÑоÑ, опеÑаÑÐ¸Ð¾Ð½Ð½Ð°Ñ ÑиÑÑема и компилÑÑоÑ.
ÐеÑоÑноÑÑÑ Ð·Ð´ÐµÑÑ Ð²ÑÑажаеÑÑÑ Ð² Ñом, ÑÑо некоÑоÑÑе знаÑениÑ, коÑоÑÑе нелÑÐ·Ñ Ð¿ÑеобÑазоваÑÑ Ð²Ð¾ внÑÑÑенний ÑоÑмаÑ, ÑÐ¾Ñ ÑанÑÑÑÑÑ Ð¿ÑиближÑнно, Ñак ÑÑо полÑÑенное знаÑение Ð¼Ð¾Ð¶ÐµÑ Ð½ÐµÑколÑко оÑлиÑаÑÑÑÑ Ð¾Ñ Ð·Ð°Ð¿Ð¸Ñанного. УпÑавление подобнÑми оÑибками и Ð¸Ñ ÑаÑпÑоÑÑÑанение в пÑоÑеÑÑе вÑÑиÑлений ÑвлÑеÑÑÑ Ð¿ÑедмеÑом изÑÑÐµÐ½Ð¸Ñ Ñелого Ñаздела маÑемаÑики и компÑÑÑеÑной наÑки, и здеÑÑ Ð½Ðµ ÑаÑÑмаÑÑиваеÑÑÑ. ÐÑ Ð¾ÑмеÑим ÑолÑко ÑледÑÑÑее:
ÐÑли вам нÑжна ÑоÑноÑÑÑ Ð¿Ñи Ñ Ñанении и вÑÑиÑлениÑÑ (напÑимеÑ, Ð´Ð»Ñ Ð´ÐµÐ½ÐµÐ¶Ð½ÑÑ ÑÑмм), иÑполÑзÑйÑе вмеÑÑо ÑÑого Ñип
numeric.ÐÑли Ð²Ñ Ñ Ð¾ÑиÑе вÑполнÑÑÑ Ñ ÑÑими Ñипами ÑложнÑе вÑÑиÑлениÑ, имеÑÑие болÑÑÑÑ Ð²Ð°Ð¶Ð½Ð¾ÑÑÑ, ÑÑаÑелÑно изÑÑиÑе ÑеализаÑÐ¸Ñ Ð¾Ð¿ÐµÑаÑий в ваÑей ÑÑеде и оÑобенно поведение в кÑÐ°Ð¹Ð½Ð¸Ñ ÑлÑÑаÑÑ (беÑконеÑноÑÑÑ, анÑипеÑеполнение).
ÐÑовеÑка ÑавенÑÑва двÑÑ ÑиÑел Ñ Ð¿Ð»Ð°Ð²Ð°ÑÑей ÑоÑкой Ð¼Ð¾Ð¶ÐµÑ Ð½Ðµ вÑегда даваÑÑ Ð¾Ð¶Ð¸Ð´Ð°ÐµÐ¼Ñй ÑезÑлÑÑаÑ.
Ðа вÑеÑ
поддеÑживаемÑÑ
ÑейÑÐ°Ñ Ð¿Ð»Ð°ÑÑоÑмаÑ
Ñип real Ð¼Ð¾Ð¶ÐµÑ ÑоÑ
ÑаниÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¿ÑимеÑно Ð¾Ñ 1E-37 до 1E+37 Ñ ÑоÑноÑÑÑÑ Ð½Ðµ менÑÑе 6 деÑÑÑиÑнÑÑ
ÑиÑÑ. Тип double precision пÑÐµÐ´Ð»Ð°Ð³Ð°ÐµÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð² диапазоне пÑиблизиÑелÑно Ð¾Ñ 1E-307 до 1E+308 и Ñ ÑоÑноÑÑÑÑ Ð½Ðµ менÑÑе 15 ÑиÑÑ. ÐопÑÑка ÑоÑ
ÑаниÑÑ ÑлиÑком болÑÑие или ÑлиÑком маленÑкие знаÑÐµÐ½Ð¸Ñ Ð¿ÑиведÑÑ Ðº оÑибке. ÐÑли ÑоÑноÑÑÑ Ð²Ð²Ð¾Ð´Ð¸Ð¼Ð¾Ð³Ð¾ ÑиÑла ÑлиÑком велика, оно бÑÐ´ÐµÑ Ð¾ÐºÑÑглено. ÐÑи попÑÑке ÑоÑ
ÑаниÑÑ ÑиÑло, близкое к 0, но непÑедÑÑавимое как оÑлиÑное Ð¾Ñ 0, пÑоизойдÑÑ Ð¾Ñибка анÑипеÑеполнениÑ.
Ðо ÑмолÑÐ°Ð½Ð¸Ñ ÑиÑла Ñ Ð¿Ð»Ð°Ð²Ð°ÑÑей ÑоÑкой вÑводÑÑÑÑ Ð² ÑекÑÑовом виде в кÑаÑÑайÑем ÑоÑном деÑÑÑиÑном пÑедÑÑавлении; вÑводимое деÑÑÑиÑное знаÑение оказÑваеÑÑÑ Ð±Ð¾Ð»ÐµÐµ близким к изнаÑалÑÐ½Ð¾Ð¼Ñ Ð´Ð²Ð¾Ð¸ÑÐ½Ð¾Ð¼Ñ ÑиÑлÑ, Ñем лÑбое дÑÑгое знаÑение, пÑедÑÑавимое Ñ Ñой же двоиÑной ÑоÑноÑÑÑÑ. (Ðднако вÑводимое знаÑение в ÑекÑÑей ÑеализаÑии никогда не наÑ
одиÑÑÑ ÑоÑно поÑеÑедине Ð¼ÐµÐ¶Ð´Ñ Ð´Ð²ÑÐ¼Ñ Ð¿ÑедÑÑавимÑми двоиÑнÑми знаÑениÑми, во избежание ÑаÑпÑоÑÑÑанÑнной оÑибки Ñ ÑÑнкÑиÑми ввода, не ÑÑиÑÑваÑÑими коÑÑекÑно пÑавило окÑÑÐ³Ð»ÐµÐ½Ð¸Ñ Ð´Ð¾ ближайÑего ÑÑÑного.) ÐÑводимое знаÑение Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð½Ð¸Ð¼Ð°ÑÑ Ð½Ðµ болÑÑе 17 знаÑаÑиÑ
деÑÑÑиÑнÑÑ
ÑиÑÑ Ð´Ð»Ñ Ñипа float8 и не болÑÑе 9 ÑиÑÑ Ð´Ð»Ñ Ñипа float4.
ÐÑимеÑание
ÐÑеобÑазование в кÑаÑÑайÑий ÑоÑнÑй вид пÑоизводиÑÑÑ Ð³Ð¾Ñаздо бÑÑÑÑее, Ñем в ÑÑадиÑионное пÑедÑÑавление Ñ Ð¾ÐºÑÑглением.
ÐÐ»Ñ ÑовмеÑÑимоÑÑи Ñ ÑезÑлÑÑаÑами, вÑдаваемÑми ÑÑаÑÑми веÑÑиÑми PostgreSQL, и ÑменÑÑÐµÐ½Ð¸Ñ ÑоÑноÑÑи вÑводимÑÑ
ÑиÑел, когда ÑÑо ÑÑебÑеÑÑÑ, в паÑамеÑÑе extra_float_digits можно вÑбÑаÑÑ Ñакже ваÑÐ¸Ð°Ð½Ñ Ð¾ÐºÑÑглÑнного деÑÑÑиÑного вÑвода. Со знаÑением 0 воÑÑÑанавливаеÑÑÑ Ð´ÐµÐ¹ÑÑвовавÑее Ñанее по ÑмолÑÐ°Ð½Ð¸Ñ Ð¾ÐºÑÑгление ÑиÑла до 6 (Ð´Ð»Ñ Ñипа float4) или 15 (Ð´Ð»Ñ float8) знаÑаÑиÑ
деÑÑÑиÑнÑÑ
ÑиÑÑ. ÐÑи оÑÑиÑаÑелÑнÑÑ
знаÑениÑÑ
ÑиÑло знаÑаÑиÑ
ÑиÑÑ ÑменÑÑаеÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑно; напÑимеÑ, пÑи -2 ÑезÑлÑÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð¾ÐºÑÑглÑн до 4 или 13 ÑиÑÑ, ÑооÑвеÑÑÑвенно.
ÐÑи лÑбом знаÑении extra_float_digits, болÑÑем 0, вÑбиÑаеÑÑÑ ÐºÑаÑÑайÑее ÑоÑное пÑедÑÑавление.
ÐÑимеÑание
ÐÑиложениÑ, коÑоÑÑм бÑли нÑÐ¶Ð½Ñ ÑоÑнÑе ÑиÑловÑе знаÑениÑ, ÑанÑÑе задавали Ð´Ð»Ñ Ð¿Ð°ÑамеÑÑа extra_float_digits знаÑение 3, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Ð¸Ñ . Ðни могÑÑ Ð¿ÑодолжаÑÑ Ð¸ÑполÑзоваÑÑ ÑÑо знаÑение Ð´Ð»Ñ Ð¼Ð°ÐºÑималÑной ÑовмеÑÑимоÑÑи Ñ ÑазнÑми веÑÑиÑми.
Рдополнение к обÑÑнÑм ÑиÑловÑм знаÑениÑм ÑÐ¸Ð¿Ñ Ñ Ð¿Ð»Ð°Ð²Ð°ÑÑей ÑоÑкой пÑинимаÑÑ ÑледÑÑÑие ÑпеÑиалÑнÑе знаÑениÑ:
Infinity-InfinityNaN
Ðни пÑедÑÑавлÑÑÑ Ð¾ÑобÑе знаÑениÑ, опиÑаннÑе в IEEE 754, ÑооÑвеÑÑÑвенно «беÑконеÑноÑÑÑ», «минÑÑ Ð±ÐµÑконеÑноÑÑÑ» и «не ÑиÑло». ÐапиÑÑÐ²Ð°Ñ ÑÑи знаÑÐµÐ½Ð¸Ñ Ð² виде конÑÑÐ°Ð½Ñ Ð² команде SQL, иÑ
нÑжно заклÑÑаÑÑ Ð² апоÑÑÑоÑÑ, напÑÐ¸Ð¼ÐµÑ Ñак: UPDATE table SET x = '-Infinity'. РегиÑÑÑ Ñимволов в ÑÑиÑ
ÑÑÑокаÑ
не важен.
ÐÑимеÑание
СоглаÑно IEEE754, NaN не должно ÑÑиÑаÑÑÑÑ ÑавнÑм лÑÐ±Ð¾Ð¼Ñ Ð´ÑÑÐ³Ð¾Ð¼Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ñ Ð¿Ð»Ð°Ð²Ð°ÑÑей ÑоÑкой (в Ñом ÑиÑле и ÑÐ°Ð¼Ð¾Ð¼Ñ NaN). ЧÑÐ¾Ð±Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ñ Ð¿Ð»Ð°Ð²Ð°ÑÑей ÑоÑкой можно бÑло ÑоÑÑиÑоваÑÑ Ð¸ иÑполÑзоваÑÑ Ð² дÑевовиднÑÑ
индекÑаÑ
, PostgreSQL ÑÑиÑаеÑ, ÑÑо знаÑÐµÐ½Ð¸Ñ NaN ÑÐ°Ð²Ð½Ñ Ð´ÑÑг дÑÑгÑ, и пÑи ÑÑом болÑÑе лÑбÑÑ
ÑиÑловÑÑ
знаÑений (не NaN).
PostgreSQL Ñакже поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑоÑмаÑÑ float и float(, оговоÑÑннÑе в ÑÑандаÑÑе SQL, Ð´Ð»Ñ ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð½ÐµÑоÑнÑÑ
ÑиÑловÑÑ
Ñипов. ÐдеÑÑ p)p опÑеделÑÐµÑ Ð¼Ð¸Ð½Ð¸Ð¼Ð°Ð»Ñно допÑÑÑимÑÑ ÑоÑноÑÑÑ Ð² двоиÑнÑÑ
ÑиÑÑаÑ
. PostgreSQL воÑпÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð¾Ñ float(1) до float(24) как вÑÐ±Ð¾Ñ Ñипа real, а запиÑÑ Ð¾Ñ float(25) до float(53) как вÑÐ±Ð¾Ñ Ñипа double precision. ÐнаÑÐµÐ½Ð¸Ñ p вне допÑÑÑимого диапазона вÑзÑваÑÑ Ð¾ÑибкÑ. ÐÑли float ÑказÑваеÑÑÑ Ð±ÐµÐ· ÑоÑноÑÑи, подÑазÑмеваеÑÑÑ Ñип double precision.
8.1.4. ÐоÑледоваÑелÑнÑе ÑипÑ
ÐÑимеÑание
Ð ÑÑом Ñазделе опиÑÑваеÑÑÑ ÑпеÑиÑиÑнÑй Ð´Ð»Ñ PostgreSQL ÑпоÑоб ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑÑолбÑа Ñ Ð°Ð²ÑоÑвелиÑением. ÐÑÑгой ÑпоÑоб, ÑооÑвеÑÑÑвÑÑÑий ÑÑандаÑÑÑ SQL, заклÑÑаеÑÑÑ Ð² иÑполÑзовании ÑÑолбÑов иденÑиÑикаÑии и ÑаÑÑмаÑÑиваеÑÑÑ Ð² опиÑании CREATE TABLE.
Ð¢Ð¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ
smallserial, serial и bigserial не ÑвлÑÑÑÑÑ Ð½Ð°ÑÑоÑÑими Ñипами, а пÑедÑÑавлÑÑÑ Ñобой пÑоÑÑо Ñдобное ÑÑедÑÑво Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑÑолбÑов Ñ ÑникалÑнÑми иденÑиÑикаÑоÑами (подобное ÑвойÑÑÐ²Ñ AUTO_INCREMENT в некоÑоÑÑÑ
СУÐÐ). Ð ÑекÑÑей ÑеализаÑии запиÑÑ:
CREATE TABLEимÑ_ÑаблиÑÑ(имÑ_ÑÑолбÑаSERIAL );
ÑавнознаÑна ÑледÑÑÑим командам:
CREATE SEQUENCEимÑ_ÑаблиÑÑ_имÑ_ÑÑолбÑа_seq AS integer; CREATE TABLEимÑ_ÑаблиÑÑ(имÑ_ÑÑолбÑаinteger NOT NULL DEFAULT nextval('имÑ_ÑаблиÑÑ_имÑ_ÑÑолбÑа_seq') ); ALTER SEQUENCEимÑ_ÑаблиÑÑ_имÑ_ÑÑолбÑа_seq OWNED BYимÑ_ÑаблиÑÑ.имÑ_ÑÑолбÑа;
То еÑÑÑ Ð¿Ñи опÑеделении Ñакого Ñипа ÑоздаÑÑÑÑ ÑелоÑиÑленнÑй ÑÑÐ¾Ð»Ð±ÐµÑ Ñо знаÑением по ÑмолÑаниÑ, извлекаемÑм из генеÑаÑоÑа поÑледоваÑелÑноÑÑи. ЧÑÐ¾Ð±Ñ Ð² ÑÑÐ¾Ð»Ð±ÐµÑ Ð½ÐµÐ»ÑÐ·Ñ Ð±Ñло вÑÑавиÑÑ NULL, в его опÑеделение добавлÑеÑÑÑ Ð¾Ð³ÑаниÑение NOT NULL. (Ðо многиÑ
ÑлÑÑаÑÑ
Ñакже Ð¸Ð¼ÐµÐµÑ ÑмÑÑл добавиÑÑ Ð´Ð»Ñ ÑÑого ÑÑолбÑа огÑаниÑÐµÐ½Ð¸Ñ UNIQUE или PRIMARY KEY Ð´Ð»Ñ Ð·Ð°ÑиÑÑ Ð¾Ñ Ð¾ÑибоÑного Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´ÑблиÑÑÑÑиÑ
ÑÑ Ð·Ð½Ð°Ñений, но авÑомаÑиÑеÑки ÑÑо не пÑоиÑÑ
одиÑ.) ÐоÑледнÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° опÑеделÑеÑ, ÑÑо поÑледоваÑелÑноÑÑÑ Â«Ð¿ÑинадлежиÑ» ÑÑолбÑÑ, Ñак ÑÑо она бÑÐ´ÐµÑ Ñдалена пÑи Ñдалении ÑÑолбÑа или ÑаблиÑÑ.
ÐÑимеÑание
Так как ÑÐ¸Ð¿Ñ smallserial, serial и bigserial ÑÐµÐ°Ð»Ð¸Ð·Ð¾Ð²Ð°Ð½Ñ ÑеÑез поÑледоваÑелÑноÑÑи, в ÑиÑловом ÑÑÐ´Ñ Ð·Ð½Ð°Ñений ÑÑолбÑа могÑÑ Ð¾Ð±ÑазовÑваÑÑÑÑ Ð¿ÑопÑÑки (или «дÑÑÑ»), даже еÑли никакие ÑÑÑоки не ÑдалÑлиÑÑ. ÐнаÑение, вÑделенное из поÑледоваÑелÑноÑÑи, ÑÑиÑаеÑÑÑ Â«Ð·Ð°Ð´ÐµÐ¹ÑÑвованнÑм», даже еÑли ÑÑÑÐ¾ÐºÑ Ñ ÑÑим знаÑением не ÑдалоÑÑ Ð²ÑÑавиÑÑ Ð² ÑаблиÑÑ. ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑоизойÑи, напÑимеÑ, пÑи оÑкаÑе ÑÑанзакÑии, добавлÑÑÑей даннÑе. См. опиÑание nextval() в Разделе 9.17.
ЧÑÐ¾Ð±Ñ Ð²ÑÑавиÑÑ Ð² ÑÑÐ¾Ð»Ð±ÐµÑ serial ÑледÑÑÑее знаÑение поÑледоваÑелÑноÑÑи, ÐµÐ¼Ñ Ð½Ñжно пÑиÑвоиÑÑ Ð·Ð½Ð°Ñение по ÑмолÑаниÑ. ÐÑо можно ÑделаÑÑ, либо иÑклÑÑив его из ÑпиÑка ÑÑолбÑов в опеÑаÑоÑе INSERT, либо Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ»ÑÑевого Ñлова DEFAULT.
Ðмена Ñипов serial и serial4 ÑавнознаÑнÑ: они ÑоздаÑÑ ÑÑолбÑÑ integer. Так же ÑвлÑÑÑÑÑ Ñинонимами имена bigserial и serial8, но они ÑоздаÑÑ ÑÑолбÑÑ bigint. Тип bigserial ÑледÑÐµÑ Ð¸ÑполÑзоваÑÑ, еÑли за вÑÑ Ð²ÑÐµÐ¼Ñ Ð¶Ð¸Ð·Ð½Ð¸ ÑаблиÑÑ Ð¿Ð»Ð°Ð½Ð¸ÑÑеÑÑÑ Ð¸ÑполÑзоваÑÑ Ð±Ð¾Ð»ÑÑе Ñем 231 знаÑений. РнаконеÑ, Ñинонимами ÑвлÑÑÑÑÑ Ð¸Ð¼ÐµÐ½Ð° Ñипов smallserial и serial2, но они ÑоздаÑÑ ÑÑÐ¾Ð»Ð±ÐµÑ smallint.
ÐоÑледоваÑелÑноÑÑÑ, ÑÐ¾Ð·Ð´Ð°Ð½Ð½Ð°Ñ Ð´Ð»Ñ ÑÑолбÑа serial, авÑомаÑиÑеÑки ÑдалÑеÑÑÑ Ð¿Ñи Ñдалении ÑвÑзанного ÑÑолбÑа. ÐоÑледоваÑелÑноÑÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ ÑдалиÑÑ Ð¸ оÑделÑно Ð¾Ñ ÑÑолбÑа, но пÑи ÑÑом Ñакже бÑÐ´ÐµÑ Ñдалено опÑеделение знаÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑаниÑ.