MySQL / Өгөгдлийн төрлүүд

Өгөгдлийн төрлүүд

MySQL дахь өгөгдлийн төрлийг зөв сонгох нь хадгалах зай хэмнэх, гүйцэтгэлийг сайжруулах, өгөгдлийн бүрэн бүтэн байдлыг хангах үндэс юм.


Тоон төрлүүд (Numeric)

INT ба BIGINT

Бүхэл тоо хадгалахад ашиглана.

sql
age    INT,       -- -2,147,483,648 ~ 2,147,483,647
likes  INT UNSIGNED,  -- 0 ~ 4,294,967,295 (сөрөг тоо хадгалахгүй)
views  BIGINT         -- маш том тоо (~9.2 × 10^18)

| Төрөл | Хадгалах зай | Хүрээ | | ---------- | ------------ | --------------------------- | | TINYINT | 1 байт | -128 ~ 127 | | SMALLINT | 2 байт | -32,768 ~ 32,767 | | INT | 4 байт | -2.1 тэрбум ~ 2.1 тэрбум | | BIGINT | 8 байт | ~-9.2 × 10^18 ~ 9.2 × 10^18 |

Хэзээ ашиглах:

  • INT — ихэнх тохиолдолд (id, тоо хэмжээ, нас)
  • BIGINT — маш олон мөр бүхий хүснэгтийн id, утасны дугаар
  • INT UNSIGNED — зөвхөн эерэг тоо, хүрээ 2 дахин өснө

DECIMAL

Мөнгөний дүн, нарийн бутархай тоо хадгалахад зориулагдсан.

sql
price    DECIMAL(10, 2),  -- 10 оронтой, 2 нь бутархай: 99999999.99
discount DECIMAL(5,  2)   -- 999.99

DECIMAL(M, D):

  • M — нийт оронгийн тоо
  • D — бутархайн оронгийн тоо

Яагаад FLOAT биш DECIMAL? FLOAT ба DOUBLE нарийвчлалын алдаа гаргаж болно — мөнгөний дүнд аюултай.

sql
-- Буруу (мөнгөнд)
price FLOAT

-- Зөв
price DECIMAL(10, 2)

Текст төрлүүд (String)

VARCHAR

Хувьсах урттай текст — хамгийн түгээмэл хэрэглэгддэг төрөл.

sql
name        VARCHAR(100),   -- хамгийн ихдээ 100 тэмдэгт
email       VARCHAR(255),   -- и-мэйлийн стандарт урт
description VARCHAR(1000)

VARCHAR(N)N тэмдэгтийн хязгаарыг тогтооно, гэхдээ бодит агуулгын хэмжээгээр л зай эзэлнэ.

TEXT

Урт текст хадгалахад ашиглана — VARCHAR хязгаарт хүрвэл.

sql
body        TEXT,       -- хамгийн ихдээ 65,535 байт
content     MEDIUMTEXT, -- ~16 МБ
raw_data    LONGTEXT    -- ~4 ГБ

Хэзээ аль төрлийг ашиглах:

| Нөхцөл | Төрөл | | ------------------- | ------------ | | Нэр, и-мэйл, гарчиг | VARCHAR(N) | | Нийтлэлийн агуулга | TEXT | | HTML, Markdown файл | MEDIUMTEXT | | Маш том өгөгдөл | LONGTEXT |

CHAR

Тогтмол урттай текст — утга нь заавал N тэмдэгт урттай байна, богиносвол хоосон зайгаар нөхнө.

sql
country_code CHAR(2),   -- 'MN', 'US', 'DE'
status       CHAR(1)    -- 'A', 'I'

Богино, тогтмол урттай утганд VARCHAR -аас арай хурдан.


Логик төрөл (Boolean)

sql
is_active   BOOLEAN,       -- TRUE / FALSE
is_verified TINYINT(1)     -- 0 / 1 (MySQL BOOLEAN-ийн дотоод хэлбэр)

MySQL-д BOOLEAN нь бодит байдлад TINYINT(1) юм — 0 нь FALSE, 1 нь TRUE гэсэн утгатай.

sql
INSERT INTO users (name, is_active) VALUES ('Болд', TRUE);
INSERT INTO users (name, is_active) VALUES ('Дорж', 1);    -- ижил утга

Огноо цагийн төрлүүд (Date/Time)

sql
birth_date  DATE,       -- '2000-01-15'
start_time  TIME,       -- '09:30:00'
event_at    DATETIME,   -- '2024-06-01 14:30:00'
created_at  TIMESTAMP   -- '2024-06-01 14:30:00' UTC

| Төрөл | Хэлбэр | Хүрээ | | ----------- | --------------------- | ------------ | | DATE | YYYY-MM-DD | 1000–9999 он | | TIME | HH:MM:SS | Цаг хугацаа | | DATETIME | YYYY-MM-DD HH:MM:SS | 1000–9999 он | | TIMESTAMP | YYYY-MM-DD HH:MM:SS | 1970–2038 он | | YEAR | YYYY | 1901–2155 он |

DATETIME vs TIMESTAMP хэзээ аль нь:

  • DATETIME — өгөгдлийн санд байгаагаар нь хадгалдаг, timezone нөлөөлдөггүй
  • TIMESTAMP — UTC-д хөрвүүлэн хадгалдаг, server timezone-д автоматаар хөрвөнө
sql
-- Автоматаар одоогийн цагийг оруулах
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

JSON

MySQL 8.0 дээр JSON өгөгдлийг шууд хадгалах, query хийх боломжтой.

sql
settings JSON,
metadata JSON
sql
INSERT INTO users (name, settings)
VALUES ('Болд', '{"theme": "dark", "language": "mn"}');

JSON утга уншихдаа:

sql
SELECT name, settings->>'$.theme' AS theme
FROM users;

Хэзээ ашиглах: Бүтэц нь тогтмол бус, хэд хэдэн өөр шинж чанарыг нэг баганад хадгалах шаардлагатай үед.


Автоматаар нэмэгдэх дугаар

sql
id INT AUTO_INCREMENT PRIMARY KEY

AUTO_INCREMENT — мөр нэмэх бүрд автоматаар 1 нэмнэ. Зөвхөн нэг INT багана дээр хэрэглэнэ.


Жишээ: бодит хүснэгт

sql
CREATE TABLE products (
  id          INT             AUTO_INCREMENT PRIMARY KEY,
  name        VARCHAR(200)    NOT NULL,
  description TEXT,
  price       DECIMAL(10, 2)  NOT NULL,
  stock       INT             UNSIGNED DEFAULT 0,
  is_active   BOOLEAN         DEFAULT TRUE,
  sku         CHAR(10)        UNIQUE,
  created_at  TIMESTAMP       DEFAULT CURRENT_TIMESTAMP,
  updated_at  TIMESTAMP       DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

Баганыг тайлбарлавал:

  • id — 1, 2, 3... автоматаар дугаарлана
  • name — бараа нэр, хамгийн ихдээ 200 тэмдэгт
  • description — дэлгэрэнгүй тайлбар, урт текст
  • price — үнэ, бутархайтай тоо: 9990.00
  • stock — нөөцийн тоо, сөрөг байж болохгүй
  • is_active — анхдагчаар идэвхтэй
  • sku — барааны кодын дугаар, яг 10 тэмдэгт, давтагдашгүй
  • created_at / updated_at — автоматаар хянана

Дараагийн хичээлд:

INSERT командаар хүснэгтэд өгөгдөл оруулах — нэг мөр, олон мөр нэмэх, анхдагч утгыг ашиглах аргуудыг үзнэ.