Site logo

Tìm hiểu về Data Types trong MySQL: Hướng dẫn đầy đủ từ cơ bản đến nâng cao

5:00 read

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 DECIMAL thay vì FLOAT hoặc DOUBLE để 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.