Tìm hiểu về Data Types trong MySQL: Hướng dẫn đầy đủ từ cơ bản đến nâng cao
Giới thiệu về Data Types trong MySQL
MySQL là một trong những hệ quản trị cơ sở dữ liệu phổ biến nhất hiện nay, được sử dụng rộng rãi trong các dự án từ nhỏ đến lớn. Một trong những yếu tố quan trọng khi thiết kế cơ sở dữ liệu MySQL là việc lựa chọn đúng kiểu dữ liệu (data types) cho các cột trong bảng. Việc hiểu rõ và sử dụng đúng data type không chỉ giúp đảm bảo tính toàn vẹn dữ liệu mà còn tối ưu hiệu suất và không gian lưu trữ của cơ sở dữ liệu.
Trong bài viết này, chúng ta sẽ tìm hiểu chi tiết về các loại data type trong MySQL, cách sử dụng chúng, và các best practices khi làm việc với chúng.
Phân loại Data Types trong MySQL
MySQL cung cấp nhiều loại dữ liệu khác nhau, được chia thành các nhóm chính sau:
1. Numeric Data Types (Kiểu số)
Numeric data types trong MySQL được sử dụng để lưu trữ các giá trị số. Chúng được chia thành hai nhóm chính: Integer types (kiểu số nguyên) và Floating-point types (kiểu số thực).
1.1 Integer Types (Kiểu số nguyên)
| Kiểu dữ liệu | Khoảng giá trị (có dấu) | Khoảng giá trị (không dấu) | Không gian lưu trữ |
|---|---|---|---|
| TINYINT | -128 đến 127 | 0 đến 255 | 1 byte |
| SMALLINT | -32,768 đến 32,767 | 0 đến 65,535 | 2 bytes |
| MEDIUMINT | -8,388,608 đến 8,388,607 | 0 đến 16,777,215 | 3 bytes |
| INT | -2^31 đến 2^31-1 | 0 đến 2^32-1 | 4 bytes |
| BIGINT | -2^63 đến 2^63-1 | 0 đến 2^64-1 | 8 bytes |
Ví dụ sử dụng:
CREATE TABLE product (
product_id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
quantity SMALLINT UNSIGNED NOT NULL,
price DECIMAL(10,2) NOT NULL,
is_available TINYINT(1) NOT NULL DEFAULT 1 -- Thường được sử dụng làm boolean
);
1.2 Floating-Point Types (Kiểu số thực)
| Kiểu dữ liệu | Phạm vi | Độ chính xác | Không gian lưu trữ |
|---|---|---|---|
| FLOAT | -3.402823466E+38 đến -1.175494351E-38 và 1.175494351E-38 đến 3.402823466E+38 | Khoảng 7 chữ số | 4 bytes |
| DOUBLE | -1.7976931348623157E+308 đến -2.2250738585072014E-308 và 2.2250738585072014E-308 đến 1.7976931348623157E+308 | Khoảng 15 chữ số | 8 bytes |
| DECIMAL(M,D) | Phụ thuộc vào M và D | Chính xác | M+2 bytes nếu D > 0, M+1 bytes nếu D = 0 |
Ví dụ sử dụng:
CREATE TABLE measurement (
id INT AUTO_INCREMENT PRIMARY KEY,
temperature FLOAT NOT NULL, -- Độ chính xác thấp hơn
precise_value DOUBLE NOT NULL, -- Độ chính xác cao hơn
money DECIMAL(10,2) NOT NULL -- Lưu trữ dữ liệu tiền tệ chính xác
);
Lưu ý quan trọng: Khi làm việc với dữ liệu tài chính, luôn sử dụng kiểu
DECIMALthay vìFLOAThoặcDOUBLEđể tránh các lỗi làm tròn có thể dẫn đến không chính xác trong các tính toán tài chính.
2. String Data Types (Kiểu chuỗi)
MySQL cung cấp nhiều loại dữ liệu chuỗi khác nhau, mỗi loại có các đặc điểm và mục đích sử dụng riêng.
2.1 Fixed-length và Variable-length Strings
| Kiểu dữ liệu | Mô tả | Kích thước tối đa |
|---|---|---|
| CHAR(M) | Chuỗi độ dài cố định, luôn chiếm M bytes | 255 ký tự |
| VARCHAR(M) | Chuỗi độ dài thay đổi, chỉ chiếm không gian cần thiết | 65,535 ký tự |
Ví dụ sử dụng:
CREATE TABLE user (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE, -- Độ dài thay đổi, tiết kiệm không gian
country_code CHAR(2) NOT NULL, -- Độ dài cố định (ví dụ: VN, US, UK)
password_hash CHAR(64) NOT NULL -- SHA-256 hash luôn có độ dài cố định
);
2.2 Text Types (Kiểu văn bản)
| Kiểu dữ liệu | Kích thước tối đa | Không gian lưu trữ |
|---|---|---|
| TINYTEXT | 255 ký tự | L + 1 bytes |
| TEXT | 65,535 ký tự | L + 2 bytes |
| MEDIUMTEXT | 16,777,215 ký tự | L + 3 bytes |
| LONGTEXT | 4,294,967,295 ký tự | L + 4 bytes |
Ví dụ sử dụng:
CREATE TABLE blog_post (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(200) NOT NULL,
summary TEXT NOT NULL, -- Cho đoạn văn ngắn
content LONGTEXT NOT NULL, -- Cho nội dung bài viết dài
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
2.3 Binary Types (Kiểu nhị phân)
| Kiểu dữ liệu | Mô tả | Kích thước tối đa |
|---|---|---|
| BINARY(M) | Chuỗi nhị phân độ dài cố định | 255 bytes |
| VARBINARY(M) | Chuỗi nhị phân độ dài thay đổi | 65,535 bytes |
| TINYBLOB | Dữ liệu nhị phân | 255 bytes |
| BLOB | Dữ liệu nhị phân | 65,535 bytes |
| MEDIUMBLOB | Dữ liệu nhị phân | 16,777,215 bytes |
| LONGBLOB | Dữ liệu nhị phân | 4,294,967,295 bytes |
Ví dụ sử dụng:
CREATE TABLE file_storage (
id INT AUTO_INCREMENT PRIMARY KEY,
file_name VARCHAR(255) NOT NULL,
file_data MEDIUMBLOB NOT NULL, -- Lưu trữ tệp tin nhị phân như ảnh, PDF
file_hash BINARY(32) NOT NULL -- Lưu trữ hash MD5/SHA-256
);
3. Date and Time Data Types (Kiểu ngày và giờ)
MySQL cung cấp nhiều kiểu dữ liệu để lưu trữ thông tin về ngày và thời gian:
| Kiểu dữ liệu | Định dạng | Phạm vi | Không gian lưu trữ |
|---|---|---|---|
| DATE | 'YYYY-MM-DD' | '1000-01-01' đến '9999-12-31' | 3 bytes |
| TIME | 'HH:MM:SS' | '-838:59:59' đến '838:59:59' | 3 bytes |
| DATETIME | 'YYYY-MM-DD HH:MM:SS' | '1000-01-01 00:00:00' đến '9999-12-31 23:59:59' | 8 bytes |
| TIMESTAMP | 'YYYY-MM-DD HH:MM:SS' | '1970-01-01 00:00:01' UTC đến '2038-01-19 03:14:07' UTC | 4 bytes |
| YEAR | YYYY | 1901 đến 2155 | 1 byte |
Ví dụ sử dụng:
CREATE TABLE event (
id INT AUTO_INCREMENT PRIMARY KEY,
event_name VARCHAR(100) NOT NULL,
event_date DATE NOT NULL, -- Chỉ lưu ngày
start_time TIME NOT NULL, -- Chỉ lưu giờ
end_time TIME NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP, -- Lưu cả ngày và giờ
last_updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP -- Tự động cập nhật khi record thay đổi
);
Lưu ý về TIMESTAMP: Kiểu TIMESTAMP trong MySQL lưu trữ giá trị UTC và tự động chuyển đổi sang múi giờ của session khi truy vấn. Còn DATETIME thì lưu trữ giá trị chính xác như đã nhập.
4. Spatial Data Types (Kiểu dữ liệu không gian)
MySQL hỗ trợ các kiểu dữ liệu không gian để lưu trữ dữ liệu địa lý:
| Kiểu dữ liệu | Mô tả |
|---|---|
| GEOMETRY | Có thể lưu trữ bất kỳ loại giá trị không gian nào |
| POINT | Lưu trữ một điểm (tọa độ X, Y) |
| LINESTRING | Lưu trữ một đường thẳng (nhiều điểm) |
| POLYGON | Lưu trữ một đa giác (nhiều đường) |
| MULTIPOINT | Lưu trữ nhiều điểm |
| MULTILINESTRING | Lưu trữ nhiều đường thẳng |
| MULTIPOLYGON | Lưu trữ nhiều đa giác |
| GEOMETRYCOLLECTION | Lưu trữ tập hợp các đối tượng không gian |
Ví dụ sử dụng:
CREATE TABLE store_locations (
id INT AUTO_INCREMENT PRIMARY KEY,
store_name VARCHAR(100) NOT NULL,
location POINT NOT NULL, -- Lưu trữ tọa độ vị trí cửa hàng
delivery_area POLYGON -- Lưu trữ khu vực giao hàng
);
-- Chèn dữ liệu không gian
INSERT INTO store_locations (store_name, location)
VALUES ('Cửa hàng Trung tâm', ST_GeomFromText('POINT(105.85 21.03)')); -- Tọa độ Hà Nội
5. JSON Data Type
Từ MySQL 5.7.8, MySQL đã hỗ trợ kiểu dữ liệu JSON gốc, cho phép lưu trữ và truy vấn dữ liệu JSON một cách hiệu quả:
Ví dụ sử dụng:
CREATE TABLE product_details (
id INT AUTO_INCREMENT PRIMARY KEY,
product_id INT NOT NULL,
attributes JSON NOT NULL, -- Lưu trữ các thuộc tính động của sản phẩm
FOREIGN KEY (product_id) REFERENCES products(id)
);
-- Chèn dữ liệu JSON
INSERT INTO product_details (product_id, attributes)
VALUES (1, '{"color": "black", "size": "M", "materials": ["cotton", "polyester"], "dimensions": {"width": 20, "height": 30}}');
-- Truy vấn dữ liệu JSON
SELECT product_id, JSON_EXTRACT(attributes, '$.color') AS color
FROM product_details
WHERE JSON_EXTRACT(attributes, '$.size') = 'M';
-- Hoặc sử dụng toán tử ->
SELECT product_id, attributes->'$.color' AS color
FROM product_details
WHERE attributes->'$.size' = 'M';
Yêu cầu đăng nhập
Vui lòng đăng nhập để truy cập nội dung này
Additional Resources
Course Guide
Comprehensive PDF guide with examples
GitHub Repository
Example code for all lessons
Discussion
Have a question about this lesson? Post it here and get answers from instructors and peers.
