05 β Ma'lumot turlari¶
β¬ οΈ Oldingi: 04 β CREATE β baza va jadval yaratish Β· π README Β· Keyingi: 06 β INSERT β ma'lumot kiritish β‘οΈ
Bu bobda: MySQL'dagi asosiy ma'lumot turlarini β sonlar (INT, DECIMAL, FLOAT), matnlar (CHAR, VARCHAR, TEXT), sana-vaqt (DATE, DATETIME, TIMESTAMP) va maxsus turlarni (ENUM, BOOLEAN, JSON) o'rganamiz; har bir ustunga to'g'ri tur tanlashni va pul nima uchun har doim DECIMAL'da saqlanishini ko'rib chiqamiz.
To'g'ri tur β to'g'ri poydevor. Har bir ustunga "bu yerda NIMA saqlanadi?" deb savol bering.
Bu xuddi oshxonada mahsulotga idish tanlashga o'xshaydi: guruch β qopda, yog' β shishada, tuz β tuzdonda. Har bir mahsulotga o'z idishi bor. Bazada ham shunday: har bir ma'lumotga o'z turi bor. Noto'g'ri "idish" tanlasangiz β yo joy isrof bo'ladi, yo ma'lumotning o'zi buziladi.
Sonlar¶
| Tur | Diapazon | Qachon | Misol |
|---|---|---|---|
TINYINT |
-128..127 (UNSIGNED: 0..255) | yosh, status | yosh TINYINT UNSIGNED |
SMALLINT |
Β±32 767 | qavat, o'rinlar soni | qavat SMALLINT |
INT |
Β±2.1 milliard | oddiy butun sonlar | sahifa INT |
BIGINT |
Β±9.2 kvintillion | juda katta sonlar, ID'lar | id BIGINT |
DECIMAL(M,D) |
jami M raqam, D tasi kasrda | PUL va aniq kasrlar | narx DECIMAL(12,2) |
FLOAT/DOUBLE |
taxminiy kasrlar | ilmiy o'lchovlar | harorat FLOAT |
UNSIGNED β "ishorasiz" degani: manfiy qiymat taqiqlanadi, evaziga musbat chegara ikki baravar oshadi. Yosh, ombordagi miqdor kabi hech qachon manfiy bo'lmaydigan butun sonlarga juda mos.
DECIMAL(12,2) o'qilishi: jami 12 raqam, shundan 2 tasi kasrdan keyin β maksimum 9 999 999 999.99.
OLTIN QOIDA: pul = DECIMAL. Hech qachon FLOAT emas!
-- Nega? Sinab ko'ring:
SELECT 0.1 + 0.2; -- 0.3 (MySQL buni aniq DECIMAL sifatida hisoblaydi)
SELECT 0.1e0 + 0.2e0; -- 0.30000000000000004 (e0 qo'shilsa son DOUBLE β taxminiy suzuvchi nuqtali songa aylanadi!)
FLOAT kompyuterda ikkilik (binar) kasr sifatida taxminan saqlanadi: 0.1 ni ikkilikda aniq yozib bo'lmaydi β xuddi 1/3 ni o'nlikda aniq yozib bo'lmagani kabi (0.3333...). Pulda "taxminan" degani β mijoz pulining yo'qolishi degani. Million tranzaksiyada shu mayda farqlar yig'ilib, hisobotdagi haqiqiy kamomadga aylanadi.
Matnlar¶
| Tur | Hajm | Qachon |
|---|---|---|
CHAR(N) |
doim aniq N belgi | viloyat kodi CHAR(2), valyuta CHAR(3) |
VARCHAR(N) |
N gacha belgi | ism, telefon, email β eng ko'p ishlatiladi |
TEXT |
65 535 baytgacha (~64 KB) | maqola, izoh |
LONGTEXT |
4 GB gacha | juda katta matn (kamdan-kam kerak) |
Farqi nimada? CHAR(10) har doim 10 belgilik joy egallaydi: 'abc' yozsangiz, qolgan 7 joyni probel bilan to'ldiradi (o'qiyotganda esa bu probellarni o'zi olib tashlaydi). VARCHAR(10) esa faqat kerakli joyni oladi: 'abc' uchun 3 belgi + uzunlikni eslab qolish uchun 1 bayt. Shuning uchun uzunligi o'zgarib turadigan matnlarga VARCHAR, doim bir xil uzunlikdagi kodlarga CHAR mos.
Hajmni real ehtiyojga qarab tanlang: telefon uchun VARCHAR(20) yetadi, VARCHAR(255) shart emas.
π TEXT hajmi belgida emas, baytda o'lchanadi: utf8mb4 kodlashda bitta belgi 4 baytgacha joy olishi mumkin, shuning uchun sig'adigan belgilar soni 65 535 dan kamroq bo'lishi mumkin.
Sana va vaqt¶
| Tur | Format | Diapazon | Misol |
|---|---|---|---|
DATE |
YYYY-MM-DD | 1000..9999-yillar | tug'ilgan kun |
TIME |
HH:MM:SS | β | dars vaqti |
DATETIME |
YYYY-MM-DD HH:MM:SS | 1000..9999-yillar | buyurtma vaqti |
TIMESTAMP |
DATETIME kabi | 1970..2038-yillar | yaratilgan vaqt |
DATETIME siz yozgan vaqtni "qotirib" saqlaydi. TIMESTAMP esa vaqtni UTC'da saqlab, o'qiyotganda sessiyaning vaqt mintaqasiga moslab ko'rsatadi β server boshqa mamlakatga ko'chsa ham vaqt to'g'ri qoladi. Lekin chegarasi tor: faqat 1970β2038 yillar (mashhur "2038-yil muammosi"). Tug'ilgan kun kabi eski sanalarga DATE/DATETIME ishlating.
Yozuv qachon yaratilganini avtomatik saqlash β juda keng tarqalgan usul:
Sana har doim '2026-06-09' ko'rinishda β YYYY-MM-DD tartibida, bitta tirnoq (apostrof) ichida yoziladi. MySQL '2026/06/09' kabi boshqa ajratgichlarni ham tushunadi, lekin tartib doim yil-oy-kun bo'lishi shart. Odat qiling: faqat YYYY-MM-DD.
Hozirgi sana-vaqtni so'rash uchun tayyor funksiyalar bor (10-bobda batafsil ko'ramiz):
SELECT NOW(); -- hozirgi sana va vaqt: 2026-06-09 14:30:00
SELECT CURDATE(); -- bugungi sana: 2026-06-09
SELECT CURTIME(); -- hozirgi vaqt: 14:30:00
Maxsus turlar¶
holat ENUM('yangi', 'jarayonda', 'tugadi') -- faqat shu 3 qiymatdan biri
faol BOOLEAN -- 0 yoki 1 (TRUE/FALSE)
sozlamalar JSON -- JSON ma'lumot
ENUMβ ro'yxatdan tashqari qiymat kiritsangiz, MySQL 8 xato beradi. Ehtiyot bo'ling: keyinchalik yangi qiymat qo'shish uchunALTER TABLEkerak bo'ladi, shuning uchun tez-tez o'zgaradigan ro'yxatlarga ENUM emas, alohida jadval yaxshiroq.BOOLEANβ aslidaTINYINT(1)ning boshqa nomi:TRUE1 bo'lib,FALSE0 bo'lib saqlanadi. SELECT'da 1 yoki 0 ko'rinadi β bu normal.JSONβ MySQL kiritilgan matn haqiqiy JSON ekanini tekshiradi: format noto'g'ri bo'lsa, xato olasiz.
5-bob masalalari¶
sinovbazasida ishlang.
- Quyidagilarga tur tanlang (yozing): odam yoshi, kitob narxi, telefon raqami, tug'ilgan sana, maqola matni
- Quyidagilarga tur tanlang: mahsulot soni omborda, mashina raqami, e-mail, ro'yxatdan o'tgan vaqt (sana+soat), reyting (4.85 kabi)
SELECT 0.1 + 0.2;vaSELECT 0.1e0 + 0.2e0;β ikkalasini bajarib, farqni o'z ko'zingiz bilan ko'ringtovarlarjadvali yarating: narx DECIMAL(10,2) bilan.INSERTqilib 19999.99 kiriting, SELECT bilan ko'ring- O'sha jadvalga 999999999.99 kiritib ko'ring (sig'adimi? DECIMAL(10,2) = max 8 ta butun raqam!) β xatoni o'qing
VARCHAR(5)ustunli jadval yarating, 'Salomlar' (8 belgi) kiritib ko'ring β nima bo'ldi?CHAR(10)vaVARCHAR(10)ustunli jadval yarating, ikkalasiga 'abc' kiriting,SELECT LENGTH(ustun)bilan uzunliklarni solishtiring. Kutilmagan natija: ikkalasi ham 3! Sababi β MySQL CHAR'ni o'qiyotganda oxiriga qo'shilgan probellarni avtomatik olib tashlaydiDATEustunli jadvalga '2026-13-45' kiritib ko'ring β MySQL nima dedi?- '09.06.2026' (kun-oy-yil tartibi) kiritib ko'ring β qabul qildimi? Xulosa: tartib faqat YYYY-MM-DD
- ENUM sinovi:
holat ENUM('yangi','eski')ustuniga 'ortacha' kiritib ko'ring - BOOLEAN ustun yarating, TRUE kiriting, SELECT qiling β nima ko'rinadi? (1)
- TINYINT ustunga 300 kiritib ko'ring β xato yoki ogohlantirishni o'qing
- TINYINT UNSIGNED ga -5 kiritib ko'ring
- Bankomat tizimi uchun
kartalarjadvalini loyihalang: karta raqami, egasi, balans, amal qilish muddati β har turni asoslang - Ob-havo jadvali: shahar, sana, harorat (manfiy ham bo'ladi!), namlik foizi β turlarni tanlang
SELECT NOW();natijasi qaysi turga mos: DATE, TIME yoki DATETIME?SELECT CURDATE();vaSELECT CURTIME();β natijalarini solishtiring- JSON ustunli jadval yarating:
malumot JSON.INSERT ... VALUES ('{"rang": "qizil"}')kiriting - Telefon raqamni INT'da saqlasa nima muammo? (boshidagi 0 va + yo'qoladi, 998... INT'ga sig'maydi) β VARCHAR'da saqlab tekshiring
- O'zingiz ishlatadigan biror ilovaning bitta jadvalini tasavvur qilib, 8 ustunga tur tanlang va yarating