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.

🕑 11 daqiqa o‘qish 📄 813 so‘z 👁 1 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Matn turlari
  2. Son turlari
  3. Butun son va avtomatik raqamlash
  4. Mantiqiy tur
  5. Sana va vaqt
  6. Turni o'zgartirish
  7. Xulosa

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.

Kundalik ishda kerak bo'ladigan turlar MATN text varchar(n) char(n) odatda: text SON integer / bigint numeric(p,s) real / double pul uchun: numeric VAQT date timestamptz interval deyarli har doim: timestamptz MANTIQIY boolean IDENTIFIKATOR uuid MURAKKAB array · jsonb Asosiy qoida Shubha bo'lsa: matn uchun text, pul uchun numeric, vaqt uchun timestamptz
Massiv va JSONB turlari 11 va 12-bo'limlarda batafsil ko'riladi

Matn turlari #

Boshqa bazalardan kelgan odamlar odatda varchar(50) yozadi. PostgreSQL da bu shart emas:

TurIzoh
textCheklanmagan uzunlik
varchar(n)n belgidan oshsa - xato
char(n)Har doim n gacha bo'sh joy bilan to'ldiriladi
text va varchar tezligi bir xil

Ko'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.

SQL
SELECT 0.1::double precision + 0.2::double precision AS taxminiy,
       0.1::numeric + 0.2::numeric AS aniq;
Natija
      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.

SQL
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;
Natija
 double_tengmi | numeric_tengmi
---------------+----------------
 f             | t
(1 row)
TurHajmiAniqmiQachon
smallint2 baytha−32 768 ... 32 767
integer4 baythaodatiy butun son
bigint8 baythakatta identifikatorlar
numeric(p,s)o'zgaruvchanhapul, hisob-kitob
real4 baytyo'qfizika, grafika
double precision8 baytyo'qilmiy hisob
Pulni hech qachon real yoki double da saqlamang

Yuqoridagi 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:

UsulMisol
numeric(12,2)45000.50 - o'qish qulay
bigint tiyinlarda4500050 - eng tez

Ikkalasi ham aniq. Tanlov tezlik va qulaylik orasida.

numeric ning aniqligini ko'rsatamiz:

SQL
SELECT 1000000.01::numeric * 3 AS aniq,
       1000000.01::real * 3     AS taxminiy;
Natija
    aniq    | taxminiy
------------+----------
 3000000.03 |  3000000
(1 row)

Butun son va avtomatik raqamlash #

Eski PostgreSQL da serial ishlatilardi. Zamonaviy usul - IDENTITY:

SQL
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;
Natija
CREATE TABLE
INSERT 0 3
 id |   ism
----+----------
  1 | Husanboy
  2 | Malika
  3 | Nodira
(3 rows)
UsulIzoh
serialEski, standart emas
GENERATED BY DEFAULT AS IDENTITYQo'lda ham qiymat berish mumkin
GENERATED ALWAYS AS IDENTITYFaqat 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.

SQL
SELECT true AS rost,
       false AS yolgon,
       NULL::boolean AS nomalum,
       true AND NULL AS va_natija,
       true OR NULL  AS yoki_natija;
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:

TurMintaqani saqlaydimi
timestampYo'q - shunchaki sana va vaqt
timestamptzHa - UTC da saqlanadi, ko'rsatishda o'giriladi
SQL
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;
Natija
    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)
Deyarli har doim timestamptz tanlang

timestamp (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:

SQL
SELECT '42'::int          AS ikki_nuqta,
       CAST('42' AS int)  AS standart,
       '3.7'::numeric::int AS yaxlitlangan;
Natija
 ikki_nuqta | standart | yaxlitlangan
------------+----------+--------------
         42 |       42 |            4
(1 row)

Oxirgi ustun qiziq: numeric dan int ga o'tishda PostgreSQL yaxlitlaydi, kesmaydi. 3.74.

Amaliy topshiriq
  1. 0.1::real + 0.2::real va numeric variantini solishtiring.
  2. Farq nima uchun paydo bo'lishini yozing.
  3. Pul saqlash uchun ikkita to'g'ri usulni sanang.
  4. text va varchar(255) tezlik farqi bormi? Javobingizni asoslang.
  5. IDENTITY ning ALWAYS va BY DEFAULT farqini yozing.
  6. true AND NULL va true OR NULL natijalarini tushuntiring.
  7. timestamp va timestamptz farqini uch qatorda yozing.
  8. Tug'ilgan sana uchun qaysi tur to'g'ri? Nega?
  9. '3.5'::numeric::int nima beradi - yaxlitlaydimi yoki kesadimi?
  10. O'z loyihangizdagi bitta jadval uchun turlarni qayta tanlang.

Xulosa #

  • PostgreSQL da text va varchar bir xil tezlikda ishlaydi.
  • Uzunlik haqiqatan cheklangan bo'lmasa, text ishlating.
  • char(n) qiymatni bo'sh joy bilan to'ldiradi - undan qoching.
  • Pul va hisob-kitob uchun faqat numeric yoki butun songa aylantirilgan tiyin.
  • real va double ikkilikda aniq emas - ular fizika va grafika uchun.
  • Avtomatik raqamlashda zamonaviy usul - GENERATED ALWAYS AS IDENTITY.
  • boolean uchta holatga ega: rost, yolg'on va NULL.
  • true OR NULL rost beradi, true AND NULL esa noma'lum.
  • Vaqt uchun deyarli har doim timestamptz - u UTC da saqlaydi.
  • Turni o'zgartirishda numeric dan int ga o'tish yaxlitlaydi.

Keyingi bo'limda jadval yaratamiz va unga cheklovlar qo'yamiz.

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.