PHP và MySQL Bài 18: Giới thiệu MySQL, Hệ quản trị cơ sở dữ liệu và Các kiểu dữ liệu
Từ đầu series đến giờ, chúng ta đã học cách dùng PHP để xử lý tính toán, nhận dữ liệu từ Form và kiểm tra đăng nhập. Tuy nhiên, toàn bộ dữ liệu đó (biến, mảng, session) đều nằm trên RAM của máy chủ. Chỉ cần máy chủ khởi động lại, mọi dữ liệu sẽ "bốc hơi" không dấu vết.
Để lưu trữ thông tin vĩnh viễn (như danh sách người dùng, lịch sử giao dịch, bài báo cáo), chúng ta cần một cái "kho". Kho đó chính là Cơ sở dữ liệu (Database), và người quản lý cái kho đó chính là MySQL.
1. Cơ sở dữ liệu và Hệ quản trị (RDBMS) là gì?
- Cơ sở dữ liệu (Database): Là một tập hợp các dữ liệu được tổ chức có cấu trúc, giúp máy tính dễ dàng lưu trữ, tìm kiếm và truy xuất.
- Hệ quản trị CSDL quan hệ (RDBMS - Relational Database Management System): Là phần mềm giúp bạn tạo ra, quản lý và tương tác với Database. MySQL chính là một RDBMS mã nguồn mở phổ biến nhất thế giới. "Quan hệ" có nghĩa là dữ liệu được lưu thành các bảng, và các bảng này có sự liên kết chặt chẽ với nhau (ví dụ: bảng Người dùng liên kết với bảng Giao dịch).
- SQL (Structured Query Language): Là ngôn ngữ tiêu chuẩn để ra lệnh cho MySQL. (Ví dụ: "Hãy lấy cho tôi 10 người dùng mới nhất").
2. Cấu trúc cốt lõi của một CSDL Quan hệ
Trong MySQL, dữ liệu không bị ném lộn xộn vào một chỗ. Nó được tổ chức cực kỳ chặt chẽ theo phân cấp sau:
- Database (Cơ sở dữ liệu): Thùng chứa lớn nhất của một dự án (Ví dụ:
he_thong_ban_ve). - Table (Bảng): Nằm trong Database, dùng để chứa một nhóm đối tượng cụ thể. Bạn có thể coi nó giống như một sheet trong Excel (Ví dụ: bảng
users, bảngtransactions). - Column / Field (Cột / Trường): Đại diện cho các thuộc tính của đối tượng. Mỗi cột chỉ được chứa một kiểu dữ liệu duy nhất (Ví dụ: cột
ho_ten, cộtngay_sinh). - Row / Record (Hàng / Bản ghi): Là một dòng dữ liệu thực tế mang thông tin cụ thể (Ví dụ: Hàng thứ nhất chứa thông tin của anh "Nguyễn Văn A", sinh năm "1990").
3. Các kiểu dữ liệu thông dụng trong MySQL
Khi thiết kế Bảng (Table), quy tắc sống còn là bạn phải định nghĩa chính xác kiểu dữ liệu cho từng cột. Việc này giúp tiết kiệm dung lượng ổ cứng, tăng tốc độ truy vấn và ngăn chặn việc lưu trữ sai định dạng (ví dụ: cấm nhập chữ "hello" vào cột Số tiền).
Dưới đây là các kiểu dữ liệu bạn sẽ gặp trong 99% các dự án Backend:
Nhóm Dữ liệu Chuỗi (String)
| Kiểu dữ liệu | Đặc điểm và Kích thước | Ứng dụng thực tế |
|---|---|---|
| VARCHAR(n) | Chuỗi có độ dài thay đổi (tối đa n ký tự, cao nhất 65,535). Chỉ tốn dung lượng bằng số ký tự thực tế nhập vào. |
Họ tên, Email, Tiêu đề bài viết, Mật khẩu đã mã hóa. |
| CHAR(n) | Chuỗi có độ dài cố định. Nếu nhập ít hơn n, hệ thống tự thêm khoảng trắng cho đủ. Tốc độ đọc rất nhanh. |
Mã số sinh viên, Mã quốc gia (VN, US), Số điện thoại cố định độ dài. |
| TEXT | Chuỗi văn bản rất dài (lên tới 65,535 byte). Không thể đánh index (chỉ mục) toàn bộ cột này. | Nội dung bài viết, Bình luận, Mô tả sản phẩm, Chuỗi JSON dài. |
Nhóm Dữ liệu Số (Numeric)
| Kiểu dữ liệu | Đặc điểm và Kích thước | Ứng dụng thực tế |
|---|---|---|
| INT | Số nguyên tiêu chuẩn (Từ -2 tỷ đến 2 tỷ). Kích thước lưu trữ là 4 bytes. | ID định danh, Số lượng sản phẩm, Lượt xem bài viết. |
| TINYINT | Số nguyên siêu nhỏ (Từ -128 đến 127). Rất tiết kiệm dung lượng (1 byte). | Trạng thái (0: Ẩn, 1: Hiện), Giới tính, Tuổi. |
| FLOAT / DOUBLE | Số thực (có phần thập phân). Có thể xảy ra sai số làm tròn cực kỳ nhỏ trong toán học máy tính. | Chiều cao, Cân nặng, Điểm số trung bình. |
| DECIMAL(M, D) | Số thập phân chính xác tuyệt đối. M là tổng số chữ số, D là số chữ số phần thập phân. |
Số dư tài khoản ngân hàng, Tính toán tiền tệ (Ví dụ: DECIMAL(10,2)). |
Nhóm Thời gian (Date & Time)
| Kiểu dữ liệu | Đặc điểm và Kích thước | Ứng dụng thực tế |
|---|---|---|
| DATE | Chỉ lưu Ngày-Tháng-Năm (YYYY-MM-DD). |
Ngày sinh nhật, Ngày thành lập công ty. |
| DATETIME | Lưu cả Ngày và Giờ (YYYY-MM-DD HH:MM:SS). Phạm vi từ năm 1000 đến 9999. |
Thời gian đăng bài, Lịch hẹn sự kiện. |
| TIMESTAMP | Lưu Ngày và Giờ, tự động chuyển đổi theo múi giờ (Timezone) của Server. Giới hạn đến năm 2038. | Thời điểm giao dịch (created_at, updated_at). |
4. Đặc thù của kiểu Boolean trong MySQL
Một điều khá thú vị là MySQL không có kiểu dữ liệu BOOLEAN thực sự bên dưới hệ thống lưu trữ.
Khi bạn khai báo một cột là BOOLEAN hoặc BOOL, MySQL sẽ tự động ngầm chuyển đổi nó thành kiểu TINYINT(1).
- Giá trị
0đại diện choFALSE. - Giá trị
1đại diện choTRUE.
Do đó, khi viết code PHP để kiểm tra trạng thái từ CSDL, bạn cần lưu ý so sánh với số 0 hoặc 1 thay vì chữ true/false.
5. Nguyên tắc chọn kiểu dữ liệu tối ưu
Trong hệ thống Backend hiệu năng cao, nguyên tắc thiết kế CSDL là: "Nhỏ nhất có thể".
- Đừng dùng
INTđể lưu tuổi con người (không ai sống quá 255 tuổi), hãy dùngTINYINT. - Đừng dùng
VARCHAR(255)theo thói quen cho mọi cột. Nếu cột mã thẻ luôn dài đúng 10 ký tự, hãy dùngCHAR(10)để tối ưu tốc độ đọc. - Tuyệt đối không dùng
FLOATđể lưu tiền bạc, vì lỗi sai số làm tròn có thể gây thâm hụt tài chính. Bắt buộc dùngDECIMAL.
Tổng kết
Nắm vững các kiểu dữ liệu là bạn đã có bản thiết kế hoàn chỉnh cho chiếc kho lưu trữ của mình. Ở bài tiếp theo, chúng ta sẽ xắn tay áo lên để thực sự đưa dữ liệu vào và lấy dữ liệu ra khỏi chiếc kho đó.
Đó sẽ là nội dung của Bài 19: Các câu lệnh SQL cơ bản: CREATE, INSERT, SELECT, UPDATE, DELETE (CRUD).
All rights reserved