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 можно бÑло ÑоÑÑиÑоваÑÑ Ð¸ иÑполÑзоваÑÑ Ð² дÑевовиднÑÑ
индекÑаÑ
, Postgres Pro ÑÑиÑаеÑ, ÑÑо знаÑÐµÐ½Ð¸Ñ 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, пÑоизойдÑÑ Ð¾Ñибка анÑипеÑеполнениÑ.
ÐÑимеÑание
ÐаÑамеÑÑ extra_float_digits опÑеделÑÐµÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво дополниÑелÑнÑÑ
знаÑаÑиÑ
ÑиÑÑ Ð¿Ñи пÑеобÑазовании знаÑÐµÐ½Ð¸Ñ Ñ Ð¿Ð»Ð°Ð²Ð°ÑÑей ÑоÑкой в ÑекÑÑ Ð´Ð»Ñ Ð²Ñвода. Со знаÑением по ÑмолÑÐ°Ð½Ð¸Ñ (0) вÑвод бÑÐ´ÐµÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñм на вÑеÑ
плаÑÑоÑмаÑ
, поддеÑживаемÑÑ
Postgres Pro. ÐÑи его ÑвелиÑении вÑводимое знаÑение ÑиÑла бÑÐ´ÐµÑ Ð±Ð¾Ð»ÐµÐµ ÑоÑно пÑедÑÑавлÑÑÑ Ñ
Ñанимое, но Ð¾Ñ ÑÑого Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ÑÑÑадаÑÑ Ð¿ÐµÑеноÑимоÑÑÑ.
Рдополнение к обÑÑнÑм ÑиÑловÑм знаÑениÑм ÑÐ¸Ð¿Ñ Ñ Ð¿Ð»Ð°Ð²Ð°ÑÑей ÑоÑкой пÑинимаÑÑ ÑледÑÑÑие ÑпеÑиалÑнÑе знаÑениÑ:
Infinity-InfinityNaN
Ðни пÑедÑÑавлÑÑÑ Ð¾ÑобÑе знаÑениÑ, опиÑаннÑе в IEEE 754, ÑооÑвеÑÑÑвенно «беÑконеÑноÑÑÑ», «минÑÑ Ð±ÐµÑконеÑноÑÑÑ» и «не ÑиÑло». (Ðа компÑÑÑеÑаÑ
, где аÑиÑмеÑика Ñ Ð¿Ð»Ð°Ð²Ð°ÑÑей ÑоÑкой не ÑооÑвеÑÑÑвÑÐµÑ ÑÑандаÑÑÑ IEEE 754, ÑÑи знаÑениÑ, веÑоÑÑно, не бÑдÑÑ ÑабоÑаÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñм обÑазом.) ÐапиÑÑÐ²Ð°Ñ ÑÑи знаÑÐµÐ½Ð¸Ñ Ð² виде конÑÑÐ°Ð½Ñ Ð² команде SQL, иÑ
нÑжно заклÑÑаÑÑ Ð² апоÑÑÑоÑÑ, напÑÐ¸Ð¼ÐµÑ Ñак: UPDATE table SET x = '-Infinity'. РегиÑÑÑ Ñимволов в ÑÑиÑ
ÑÑÑокаÑ
не важен.
ÐÑимеÑание
СоглаÑно IEEE754, NaN не должно ÑÑиÑаÑÑÑÑ ÑавнÑм лÑÐ±Ð¾Ð¼Ñ Ð´ÑÑÐ³Ð¾Ð¼Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ñ Ð¿Ð»Ð°Ð²Ð°ÑÑей ÑоÑкой (в Ñом ÑиÑле и ÑÐ°Ð¼Ð¾Ð¼Ñ NaN). ЧÑÐ¾Ð±Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ñ Ð¿Ð»Ð°Ð²Ð°ÑÑей ÑоÑкой можно бÑло ÑоÑÑиÑоваÑÑ Ð¸ иÑполÑзоваÑÑ Ð² дÑевовиднÑÑ
индекÑаÑ
, Postgres Pro ÑÑиÑаеÑ, ÑÑо знаÑÐµÐ½Ð¸Ñ NaN ÑÐ°Ð²Ð½Ñ Ð´ÑÑг дÑÑгÑ, и пÑи ÑÑом болÑÑе лÑбÑÑ
ÑиÑловÑÑ
знаÑений (не NaN).
Postgres Pro Ñакже поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑоÑмаÑÑ float и float(, оговоÑÑннÑе в ÑÑандаÑÑе SQL, Ð´Ð»Ñ ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð½ÐµÑоÑнÑÑ
ÑиÑловÑÑ
Ñипов. ÐдеÑÑ p)p опÑеделÑÐµÑ Ð¼Ð¸Ð½Ð¸Ð¼Ð°Ð»Ñно допÑÑÑимÑÑ ÑоÑноÑÑÑ Ð² двоиÑнÑÑ
ÑиÑÑаÑ
. Postgres Pro воÑпÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð¾Ñ float(1) до float(24) как вÑÐ±Ð¾Ñ Ñипа real, а запиÑÑ Ð¾Ñ float(25) до float(53) как вÑÐ±Ð¾Ñ Ñипа double precision. ÐнаÑÐµÐ½Ð¸Ñ p вне допÑÑÑимого диапазона вÑзÑваÑÑ Ð¾ÑибкÑ. ÐÑли float ÑказÑваеÑÑÑ Ð±ÐµÐ· ÑоÑноÑÑи, подÑазÑмеваеÑÑÑ Ñип double precision.
ÐÑимеÑание
ÐÑедположение, ÑÑо ÑÐ¸Ð¿Ñ real и double precision имеÑÑ Ð² манÑиÑÑе 24 и 53 биÑа ÑооÑвеÑÑÑвенно, ÑпÑаведливо Ð´Ð»Ñ Ð²ÑеÑ
ÑеализаÑий плаваÑÑей ÑоÑки по ÑÑандаÑÑÑ IEEE. Ðа плаÑÑоÑмаÑ
, не поддеÑживаÑÑиÑ
IEEE, ÑÐ°Ð·Ð¼ÐµÑ Ð¼Ð°Ð½ÑиÑÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð½ÐµÑколÑко оÑлиÑаÑÑÑÑ, но Ð´Ð»Ñ Ð¿ÑоÑÑоÑÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ñ p везде ÑÑиÑаÑÑÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñми.
8.1.4. ÐоÑледоваÑелÑнÑе ÑипÑ
ÐÑимеÑание
Ð ÑÑом Ñазделе опиÑÑваеÑÑÑ ÑпеÑиÑиÑнÑй Ð´Ð»Ñ Postgres Pro ÑпоÑоб ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑÑолбÑа Ñ Ð°Ð²ÑоÑвелиÑением. ÐÑÑгой ÑпоÑоб, ÑооÑвеÑÑÑвÑÑÑий ÑÑандаÑÑÑ 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.16.
ЧÑÐ¾Ð±Ñ Ð²ÑÑавиÑÑ Ð² ÑÑÐ¾Ð»Ð±ÐµÑ serial ÑледÑÑÑее знаÑение поÑледоваÑелÑноÑÑи, ÐµÐ¼Ñ Ð½Ñжно пÑиÑвоиÑÑ Ð·Ð½Ð°Ñение по ÑмолÑаниÑ. ÐÑо можно ÑделаÑÑ, либо иÑклÑÑив его из ÑпиÑка ÑÑолбÑов в опеÑаÑоÑе INSERT, либо Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ»ÑÑевого Ñлова DEFAULT.
Ðмена Ñипов serial и serial4 ÑавнознаÑнÑ: они ÑоздаÑÑ ÑÑолбÑÑ integer. Так же ÑвлÑÑÑÑÑ Ñинонимами имена bigserial и serial8, но они ÑоздаÑÑ ÑÑолбÑÑ bigint. Тип bigserial ÑледÑÐµÑ Ð¸ÑполÑзоваÑÑ, еÑли за вÑÑ Ð²ÑÐµÐ¼Ñ Ð¶Ð¸Ð·Ð½Ð¸ ÑаблиÑÑ Ð¿Ð»Ð°Ð½Ð¸ÑÑеÑÑÑ Ð¸ÑполÑзоваÑÑ Ð±Ð¾Ð»ÑÑе Ñем 231 знаÑений. РнаконеÑ, Ñинонимами ÑвлÑÑÑÑÑ Ð¸Ð¼ÐµÐ½Ð° Ñипов smallserial и serial2, но они ÑоздаÑÑ ÑÑÐ¾Ð»Ð±ÐµÑ smallint.
ÐоÑледоваÑелÑноÑÑÑ, ÑÐ¾Ð·Ð´Ð°Ð½Ð½Ð°Ñ Ð´Ð»Ñ ÑÑолбÑа serial, авÑомаÑиÑеÑки ÑдалÑеÑÑÑ Ð¿Ñи Ñдалении ÑвÑзанного ÑÑолбÑа. ÐоÑледоваÑелÑноÑÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ ÑдалиÑÑ Ð¸ оÑделÑно Ð¾Ñ ÑÑолбÑа, но пÑи ÑÑом Ñакже бÑÐ´ÐµÑ Ñдалено опÑеделение знаÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑаниÑ.