Өгөгдлийн төрлүүд
MySQL дахь өгөгдлийн төрлийг зөв сонгох нь хадгалах зай хэмнэх, гүйцэтгэлийг сайжруулах, өгөгдлийн бүрэн бүтэн байдлыг хангах үндэс юм.
Тоон төрлүүд (Numeric)
INT ба BIGINT
Бүхэл тоо хадгалахад ашиглана.
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
Мөнгөний дүн, нарийн бутархай тоо хадгалахад зориулагдсан.
price DECIMAL(10, 2), -- 10 оронтой, 2 нь бутархай: 99999999.99
discount DECIMAL(5, 2) -- 999.99
DECIMAL(M, D):
M— нийт оронгийн тооD— бутархайн оронгийн тоо
Яагаад FLOAT биш DECIMAL? FLOAT ба DOUBLE нарийвчлалын алдаа гаргаж болно — мөнгөний дүнд аюултай.
-- Буруу (мөнгөнд)
price FLOAT
-- Зөв
price DECIMAL(10, 2)
Текст төрлүүд (String)
VARCHAR
Хувьсах урттай текст — хамгийн түгээмэл хэрэглэгддэг төрөл.
name VARCHAR(100), -- хамгийн ихдээ 100 тэмдэгт
email VARCHAR(255), -- и-мэйлийн стандарт урт
description VARCHAR(1000)
VARCHAR(N) — N тэмдэгтийн хязгаарыг тогтооно, гэхдээ бодит агуулгын хэмжээгээр л зай эзэлнэ.
TEXT
Урт текст хадгалахад ашиглана — VARCHAR хязгаарт хүрвэл.
body TEXT, -- хамгийн ихдээ 65,535 байт
content MEDIUMTEXT, -- ~16 МБ
raw_data LONGTEXT -- ~4 ГБ
Хэзээ аль төрлийг ашиглах:
| Нөхцөл | Төрөл |
| ------------------- | ------------ |
| Нэр, и-мэйл, гарчиг | VARCHAR(N) |
| Нийтлэлийн агуулга | TEXT |
| HTML, Markdown файл | MEDIUMTEXT |
| Маш том өгөгдөл | LONGTEXT |
CHAR
Тогтмол урттай текст — утга нь заавал N тэмдэгт урттай байна, богиносвол хоосон зайгаар нөхнө.
country_code CHAR(2), -- 'MN', 'US', 'DE'
status CHAR(1) -- 'A', 'I'
Богино, тогтмол урттай утганд VARCHAR -аас арай хурдан.
Логик төрөл (Boolean)
is_active BOOLEAN, -- TRUE / FALSE
is_verified TINYINT(1) -- 0 / 1 (MySQL BOOLEAN-ийн дотоод хэлбэр)
MySQL-д BOOLEAN нь бодит байдлад TINYINT(1) юм — 0 нь FALSE, 1 нь TRUE гэсэн утгатай.
INSERT INTO users (name, is_active) VALUES ('Болд', TRUE);
INSERT INTO users (name, is_active) VALUES ('Дорж', 1); -- ижил утга
Огноо цагийн төрлүүд (Date/Time)
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-д автоматаар хөрвөнө
-- Автоматаар одоогийн цагийг оруулах
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
JSON
MySQL 8.0 дээр JSON өгөгдлийг шууд хадгалах, query хийх боломжтой.
settings JSON,
metadata JSON
INSERT INTO users (name, settings)
VALUES ('Болд', '{"theme": "dark", "language": "mn"}');
JSON утга уншихдаа:
SELECT name, settings->>'$.theme' AS theme
FROM users;
Хэзээ ашиглах: Бүтэц нь тогтмол бус, хэд хэдэн өөр шинж чанарыг нэг баганад хадгалах шаардлагатай үед.
Автоматаар нэмэгдэх дугаар
id INT AUTO_INCREMENT PRIMARY KEY
AUTO_INCREMENT — мөр нэмэх бүрд автоматаар 1 нэмнэ. Зөвхөн нэг INT багана дээр хэрэглэнэ.
Жишээ: бодит хүснэгт
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.00stock— нөөцийн тоо, сөрөг байж болохгүйis_active— анхдагчаар идэвхтэйsku— барааны кодын дугаар, яг 10 тэмдэгт, давтагдашгүйcreated_at/updated_at— автоматаар хянана
Дараагийн хичээлд:
INSERT командаар хүснэгтэд өгөгдөл оруулах — нэг мөр, олон мөр нэмэх, анхдагч утгыг ашиглах аргуудыг үзнэ.