3-bo‘lim
Ma'lumot turlari
Matn, son, mantiqiy, sana va UUID turlari, numeric va float farqi, timestamptz nima uchun kerak va turni o'zgartirish.
Ushbu bo‘lim mundarijasi
Tur tanlash - jadval loyihalashdagi birinchi qaror va uni keyinchalik o'zgartirish qimmatga tushadi. PostgreSQL da turlar juda ko'p, lekin amalda o'nga yaqini yetarli.
Matn turlari #
Boshqa bazalardan kelgan odamlar odatda varchar(50) yozadi.
PostgreSQL da bu shart emas:
| Tur | Izoh |
|---|---|
text | Cheklanmagan uzunlik |
varchar(n) | n belgidan oshsa - xato |
char(n) | Har doim n gacha bo'sh joy bilan to'ldiriladi |
text va varchar tezligi bir xilKo'p bazalarda qisqa varchar tezroq ishlaydi. PostgreSQL da
esa ular bir xil tarzda saqlanadi va bir xil tezlikda
ishlaydi.
Ya'ni varchar(255) yozish hech qanday tezlik bermaydi. U
faqat cheklov qo'yadi.
Shuning uchun tavsiya: uzunlik haqiqatan cheklangan bo'lsa
(masalan ikki harfli davlat kodi), varchar(2) yozing.
Qolgan hamma joyda text ishlating.
char(n) esa deyarli hech qachon kerak emas - u qiymatni
bo'sh joy bilan to'ldirib, taqqoslashda kutilmagan natija
beradi.
Son turlari #
Eng muhim qaror - pul va o'lchov uchun qaysi turni tanlash.
SELECT 0.1::double precision + 0.2::double precision AS taxminiy,
0.1::numeric + 0.2::numeric AS aniq;
taxminiy | aniq
---------------------+------
0.30000000000000004 | 0.3
(1 row)
Birinchi ustunga qarang: 0.1 + 0.2 aniq 0.3 bermadi.
Bu 5-bo'limda (Kompyuter arxitekturasi darsligida) ko'rilgan
IEEE 754 haqiqiy soni - u ikkilikda ishlaydi va 0,1 ni
aniq saqlay olmaydi. numeric esa o'nlik sanoqda
ishlaydi, shuning uchun natija aniq.
Oqibati amaliy: bunday sonlarni tenglik bilan taqqoslab bo'lmaydi.
SELECT (0.1::double precision + 0.2::double precision)
= 0.3::double precision AS double_tengmi,
(0.1::numeric + 0.2::numeric)
= 0.3::numeric AS numeric_tengmi;
double_tengmi | numeric_tengmi
---------------+----------------
f | t
(1 row)
| Tur | Hajmi | Aniqmi | Qachon |
|---|---|---|---|
smallint | 2 bayt | ha | −32 768 ... 32 767 |
integer | 4 bayt | ha | odatiy butun son |
bigint | 8 bayt | ha | katta identifikatorlar |
numeric(p,s) | o'zgaruvchan | ha | pul, hisob-kitob |
real | 4 bayt | yo'q | fizika, grafika |
double precision | 8 bayt | yo'q | ilmiy hisob |
real yoki double da saqlamangYuqoridagi misolda farq arzimas ko'rindi. Lekin million marta qo'shilganda u to'planadi.
Bank hisobida bu haqiqiy pul yo'qolishi degani - va bunday xatolar audit paytida topiladi.
To'g'ri tanlov ikkita:
| Usul | Misol |
|---|---|
numeric(12,2) | 45000.50 - o'qish qulay |
bigint tiyinlarda | 4500050 - eng tez |
Ikkalasi ham aniq. Tanlov tezlik va qulaylik orasida.
numeric ning aniqligini ko'rsatamiz:
SELECT 1000000.01::numeric * 3 AS aniq,
1000000.01::real * 3 AS taxminiy;
aniq | taxminiy
------------+----------
3000000.03 | 3000000
(1 row)
Butun son va avtomatik raqamlash #
Eski PostgreSQL da serial ishlatilardi. Zamonaviy usul -
IDENTITY:
CREATE TABLE oquvchi (
id int GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
ism text NOT NULL
);
INSERT INTO oquvchi (ism) VALUES ('Husanboy'), ('Malika'), ('Nodira');
SELECT * FROM oquvchi ORDER BY id;
CREATE TABLE
INSERT 0 3
id | ism
----+----------
1 | Husanboy
2 | Malika
3 | Nodira
(3 rows)
| Usul | Izoh |
|---|---|
serial | Eski, standart emas |
GENERATED BY DEFAULT AS IDENTITY | Qo'lda ham qiymat berish mumkin |
GENERATED ALWAYS AS IDENTITY | Faqat baza beradi - eng xavfsiz |
ALWAYS varianti tasodifiy qo'lda kiritishdan himoya qiladi -
bu identifikatorlar chalkashib ketishining oldini oladi.
Mantiqiy tur #
boolean uchta qiymat qabul qiladi: rost, yolg'on va
NULL.
SELECT true AS rost,
false AS yolgon,
NULL::boolean AS nomalum,
true AND NULL AS va_natija,
true OR NULL AS yoki_natija;
rost | yolgon | nomalum | va_natija | yoki_natija
------+--------+---------+-----------+-------------
t | f | | | t
(1 row)
Oxirgi ikki ustunga e'tibor bering. true AND NULL - noma'lum,
chunki ikkinchi qiymat noma'lum. Lekin true OR NULL -
rost, chunki bittasi rost bo'lsa, ikkinchisi muhim emas.
Sana va vaqt #
Bu yerda eng ko'p xato qilinadi. Ikkita o'xshash tur bor:
| Tur | Mintaqani saqlaydimi |
|---|---|
timestamp | Yo'q - shunchaki sana va vaqt |
timestamptz | Ha - UTC da saqlanadi, ko'rsatishda o'giriladi |
SELECT DATE '2026-03-15' AS sana,
TIMESTAMP '2026-03-15 14:30:00' AS vaqt,
INTERVAL '3 days 4 hours' AS oraliq,
DATE '2026-03-15' + INTERVAL '10 days' AS keyin;
sana | vaqt | oraliq | keyin
------------+---------------------+-----------------+---------------------
2026-03-15 | 2026-03-15 14:30:00 | 3 days 04:00:00 | 2026-03-25 00:00:00
(1 row)
timestamptz tanlangtimestamp (mintaqasiz) - bu "qandaydir soat 14:30". Lekin
qaysi shaharda?
Foydalanuvchilar turli mintaqalarda bo'lsa, timestamp
ma'lumotni buzadi: Toshkentdagi 14:30 va Londondagi 14:30
bir xil deb saqlanadi.
timestamptz esa qiymatni ichkarida UTC da saqlaydi va
ko'rsatishda mijozning mintaqasiga o'giradi. Ya'ni "aynan
qaysi lahza" degan savol bir ma'noli javob oladi.
Istisno: tug'ilgan sana yoki bayram kuni kabi mintaqasiz
tushunchalar. Ular uchun oddiy date to'g'ri.
Turni o'zgartirish #
Ikki xil yozuv bor va ikkalasi bir xil ishlaydi:
SELECT '42'::int AS ikki_nuqta,
CAST('42' AS int) AS standart,
'3.7'::numeric::int AS yaxlitlangan;
ikki_nuqta | standart | yaxlitlangan
------------+----------+--------------
42 | 42 | 4
(1 row)
Oxirgi ustun qiziq: numeric dan int ga o'tishda
PostgreSQL yaxlitlaydi, kesmaydi. 3.7 → 4.
0.1::real + 0.2::realvanumericvariantini solishtiring.- Farq nima uchun paydo bo'lishini yozing.
- Pul saqlash uchun ikkita to'g'ri usulni sanang.
textvavarchar(255)tezlik farqi bormi? Javobingizni asoslang.IDENTITYningALWAYSvaBY DEFAULTfarqini yozing.true AND NULLvatrue OR NULLnatijalarini tushuntiring.timestampvatimestamptzfarqini uch qatorda yozing.- Tug'ilgan sana uchun qaysi tur to'g'ri? Nega?
'3.5'::numeric::intnima beradi - yaxlitlaydimi yoki kesadimi?- O'z loyihangizdagi bitta jadval uchun turlarni qayta tanlang.
Xulosa #
- PostgreSQL da
textvavarcharbir xil tezlikda ishlaydi. - Uzunlik haqiqatan cheklangan bo'lmasa,
textishlating. char(n)qiymatni bo'sh joy bilan to'ldiradi - undan qoching.- Pul va hisob-kitob uchun faqat
numericyoki butun songa aylantirilgan tiyin. realvadoubleikkilikda aniq emas - ular fizika va grafika uchun.- Avtomatik raqamlashda zamonaviy usul -
GENERATED ALWAYS AS IDENTITY. booleanuchta holatga ega: rost, yolg'on va NULL.true OR NULLrost beradi,true AND NULLesa noma'lum.- Vaqt uchun deyarli har doim
timestamptz- u UTC da saqlaydi. - Turni o'zgartirishda
numericdanintga o'tish yaxlitlaydi.
Keyingi bo'limda jadval yaratamiz va unga cheklovlar qo'yamiz.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
Xatolik topdingizmi?
Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.