| ÐокÑменÑаÑÐ¸Ñ Ð¿Ð¾ PostgreSQL 9.4.1 | |||
|---|---|---|---|
| ÐÑед. | УÑÐ¾Ð²ÐµÐ½Ñ Ð²ÑÑе | Ðлава 8. Ð¢Ð¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ | След. |
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 опÑеделÑÐµÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво деÑÑÑиÑнÑÑ ÑиÑÑ Ð² дÑобной ÑаÑÑи, ÑпÑава Ð¾Ñ Ð´ÐµÑÑÑиÑной ÑоÑки, а ÑоÑноÑÑÑ — обÑее колиÑеÑÑво знаÑимÑÑ ÑиÑÑ Ð² ÑиÑле, Ñ. е. колиÑеÑÑво ÑиÑÑ Ð¿Ð¾ обе ÑÑоÑÐ¾Ð½Ñ Ð´ÐµÑÑÑиÑной ÑоÑки. ÐапÑимеÑ, ÑиÑло 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.
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) вÑвод бÑÐ´ÐµÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñм на вÑÐµÑ Ð¿Ð»Ð°ÑÑоÑÐ¼Ð°Ñ , поддеÑживаемÑÑ PostgreSQL. ÐÑи его ÑвелиÑении вÑводимое знаÑение ÑиÑла бÑÐ´ÐµÑ Ð±Ð¾Ð»ÐµÐµ ÑоÑно пÑедÑÑавлÑÑÑ Ñ Ñанимое, но Ð¾Ñ ÑÑого Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ÑÑÑадаÑÑ Ð¿ÐµÑеноÑимоÑÑÑ.
Рдополнение к обÑÑнÑм ÑиÑловÑм знаÑениÑм ÑÐ¸Ð¿Ñ Ñ Ð¿Ð»Ð°Ð²Ð°ÑÑей ÑоÑкой могÑÑ ÑодеÑжаÑÑ ÑледÑÑÑие ÑпеÑиалÑнÑе знаÑениÑ:
Infinity
-Infinity
NaN Ðни пÑедÑÑавлÑÑÑ Ð¾ÑобÑе знаÑениÑ, опиÑаннÑе в IEEE 754, ÑооÑвеÑÑÑвенно: "беÑконеÑноÑÑÑ", "минÑÑ Ð±ÐµÑконеÑноÑÑÑ" и "не ÑиÑло". (Ðо компÑÑÑеÑаÑ
, где аÑиÑмеÑика Ñ Ð¿Ð»Ð°Ð²Ð°ÑÑей ÑоÑкой не ÑооÑвеÑÑÑвÑÐµÑ ÑÑандаÑÑÑ IEEE 754, ÑÑи знаÑениÑ, веÑоÑÑно, не бÑдÑÑ ÑабоÑаÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñм обÑазом.) ÐапиÑÑÐ²Ð°Ñ ÑÑи знаÑÐµÐ½Ð¸Ñ Ð² виде конÑÑÐ°Ð½Ñ Ð² команде SQL, иÑ
нÑжно заклÑÑаÑÑ Ð² апоÑÑÑоÑÑ, напÑÐ¸Ð¼ÐµÑ Ñак: UPDATE table SET x = 'Infinity'. РегиÑÑÑ Ñимволов в ÑÑиÑ
ÑÑÑокаÑ
не важен.
ÐамеÑание: СоглаÑно IEEE754, NaN не должно ÑÑиÑаÑÑÑÑ ÑавнÑм лÑÐ±Ð¾Ð¼Ñ Ð´ÑÑÐ³Ð¾Ð¼Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ñ Ð¿Ð»Ð°Ð²Ð°ÑÑей ÑоÑкой (в Ñом ÑиÑле и ÑÐ°Ð¼Ð¾Ð¼Ñ NaN). ЧÑÐ¾Ð±Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ñ Ð¿Ð»Ð°Ð²Ð°ÑÑей ÑоÑкой можно бÑло ÑоÑÑиÑоваÑÑ Ð¸ иÑполÑзоваÑÑ Ð² дÑевовиднÑÑ Ð¸Ð½Ð´ÐµÐºÑÐ°Ñ , PostgreSQL ÑÑиÑаеÑ, ÑÑо знаÑÐµÐ½Ð¸Ñ NaN ÑÐ°Ð²Ð½Ñ Ð´ÑÑг дÑÑгÑ, и пÑи ÑÑом болÑÑе лÑбÑÑ ÑиÑловÑÑ Ð·Ð½Ð°Ñений (не NaN).
PostgreSQL Ñакже поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑоÑмаÑÑ float и float(p), оговоÑÑннÑе в ÑÑандаÑÑе SQL, Ð´Ð»Ñ ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð½ÐµÑоÑнÑÑ ÑиÑловÑÑ Ñипов. ÐдеÑÑ p опÑеделÑÐµÑ Ð¼Ð¸Ð½Ð¸Ð¼Ð°Ð»Ñно допÑÑÑимÑÑ ÑоÑноÑÑÑ Ð² двоиÑнÑÑ ÑиÑÑÐ°Ñ . PostgreSQL воÑпÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð¾Ñ 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. ÐоÑледоваÑелÑнÑе ÑипÑ
Ð¢Ð¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ smallserial, serial и bigserial не ÑвлÑÑÑÑÑ Ð½Ð°ÑÑоÑÑими Ñипами, а пÑедÑÑавлÑÑÑ Ñобой пÑоÑÑо Ñдобное ÑÑедÑÑво Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ¾Ð»Ð¾Ð½Ð¾Ðº Ñ ÑникалÑнÑми иденÑиÑикаÑоÑами (подобное ÑвойÑÑÐ²Ñ AUTO_INCREMENT в некоÑоÑÑÑ Ð¡Ð£ÐÐ). Ð ÑекÑÑей ÑеализаÑии запиÑÑ:
CREATE TABLE имÑ_ÑаблиÑÑ (
имÑ_колонки SERIAL
);ÑавнознаÑна ÑледÑÑÑим командам:
CREATE SEQUENCE имÑ_ÑаблиÑÑ_имÑ_колонки_seq;
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, авÑомаÑиÑеÑки ÑдалÑеÑÑÑ Ð¿Ñи Ñдалении ÑвÑзанной колонки. ÐоÑледоваÑелÑноÑÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ ÑдалиÑÑ Ð¸ оÑделÑно Ð¾Ñ ÐºÐ¾Ð»Ð¾Ð½ÐºÐ¸, но пÑи ÑÑом Ñакже бÑÐ´ÐµÑ Ñдалено опÑеделение знаÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑаниÑ.
| ÐÑед. | ÐаÑало | След. |
| Ð¢Ð¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ | УÑÐ¾Ð²ÐµÐ½Ñ Ð²ÑÑе | ÐенежнÑе ÑÐ¸Ð¿Ñ |