Giải thích Kiểu Dữ liệu INT của MySQL: Giá trị Tối đa, Phạm vi, Kích thước Lưu trữ & Các Thay đổi Ngừng Hỗ trợ (MySQL 8+)

1. Introduction

MySQL là một hệ quản trị cơ sở dữ liệu quan hệ phổ biến, được sử dụng rộng rãi trong nhiều ứng dụng web và hệ thống. Các kiểu dữ liệu INT trong MySQL thường được dùng để lưu trữ các giá trị số nguyên. Trong một số trường hợp, chúng ta sẽ khám phá các giá trị tối đa mà kiểu INT hỗ trợ và cách chúng được sử dụng một cách hiệu quả. Bài viết này cung cấp một giải thích chi tiết về kiểu dữ liệu INT trong MySQL, bao gồm cả cách khai thác các giá trị tối đa được hỗ trợ bởi kiểu INT và cách sử dụng chúng một cách hợp lý.

Các thông số cơ bản của kiểu INT

  • Signed (SIGNED) :
  • Giá trị tối thiểu: -2,147,483,648
  • Giá trị tối đa: 2,147,483,647
  • Unsigned (UNSIGNED) :
  • Giá trị tối thiểu: 0
  • Giá trị tối đa: 4,294,967,295

Kích thước lưu trữ của INT

Kiểu INT luôn chiếm 4 byte bộ nhớ. Kích thước này không thay đổi bất kể giá trị được lưu trữ. Do đó, nếu bạn không cần một phạm vi số rất lớn, việc sử dụng các kiểu dữ liệu nhỏ hơn (ví dụ TINYINT hoặc SMALLINT) sẽ hiệu quả hơn.

Các trường hợp sử dụng INT

Kiểu INT thường được dùng trong các tình huống sau:

  • Giá trị tự tăng (ví dụ: ID người dùng, số đơn hàng)
  • Dữ liệu số nguyên dùng trong các phép tính hoặc xử lý thống kê (ví dụ: số lượng tồn kho, số lần nhấp)
  • Dữ liệu nằm trong một phạm vi cố định (ví dụ: tuổi hoặc điểm kiểm tra)

Trong những trường hợp này, bạn cần cân nhắc phạm vi số cần thiết và hiệu suất bộ nhớ.

3. What Does M Mean in INT(M)?

What Is Display Width (M)?

Trong MySQL, M trong INT(M) đại diện cho “độ rộng hiển thị”. Nó không ảnh hưởng đến giá trị số thực tế được lưu trữ trong cơ sở dữ liệu; thay vào đó, nó xác định cách giá trị được định dạng khi hiển thị. Ví dụ, nếu khai báo INT(5), số sẽ được hiển thị với độ rộng 5 chữ số.

Tuy nhiên, độ rộng hiển thị M chỉ có ý nghĩa trong trường hợp sau:

  • Khi tùy chọn ZEROFILL được bật
  • Ví dụ: Với INT(5) ZEROFILL, nếu giá trị là 123, nó sẽ hiển thị dưới dạng 00123.

Lưu ý quan trọng về ZEROFILL

Khi sử dụng tùy chọn ZEROFILL, các đặc điểm sau sẽ áp dụng:

  1. Các số 0 phía trước sẽ tự động được thêm vào bên trái.
  2. Thuộc tính UNSIGNED sẽ được tự động áp dụng.

Do đó, nếu bạn cần lưu trữ các giá trị âm, không thể sử dụng ZEROFILL.

Giải thích các hiểu lầm phổ biến

Nhiều người mới bắt đầu nhầm tưởng rằng M giới hạn giá trị tối đa có thể lưu. Thực tế, M chỉ ảnh hưởng đến định dạng hiển thị và không có bất kỳ ảnh hưởng nào đến phạm vi lưu trữ thực tế.

4. Comparison with Other Integer Types

Các loại dữ liệu số nguyên và phạm vi của chúng

MySQL cung cấp các kiểu số nguyên sau:

Type NameBytesSigned RangeUnsigned Range
TINYINT1 byte-128 to 1270 to 255
SMALLINT2 bytes-32,768 to 32,7670 to 65,535
MEDIUMINT3 bytes-8,388,608 to 8,388,6070 to 16,777,215
INT4 bytes-2,147,483,648 to 2,147,483,6470 to 4,294,967,295
BIGINT8 bytes-9,223,372,036,854,775,808 to 9,223,372,036,854,775,8070 to 18,446,744,073,709,551,615

Tiêu chí lựa chọn

Sử dụng các hướng dẫn sau khi chọn kiểu dữ liệu phù hợp trong thiết kế cơ sở dữ liệu:

  • Nếu phạm vi nhỏ: Dùng TINYINT hoặc SMALLINT để tiết kiệm bộ nhớ.
  • Nếu cần một phạm vi rất lớn: Dùng BIGINT.
  • Nếu muốn sử dụng đa năng: INT thường là lựa chọn tối ưu.

5. Changes Since MySQL 8.0.17

Loại bỏ độ rộng hiển thị (M)

Bắt đầu từ MySQL 8.0.17, “độ rộng hiển thị (M)” cho các kiểu số nguyên đã bị loại bỏ. Thay đổi này được giới thiệu cùng với việc ngừng hỗ trợ tùy chọn ZEROFILL, và có thể sẽ bị xóa hoàn toàn trong các phiên bản MySQL tương lai.

Các lý do loại bỏ độ rộng hiển thị như sau:

  1. Gây ra hiểu lầm:
  • Nhiều người dùng nhầm tưởng rằng M ảnh hưởng đến giá trị tối đa có thể lưu hoặc số chữ số.
  1. Hạn chế trong việc sử dụng thực tế:
  • M chỉ kiểm soát định dạng hiển thị, việc định dạng hiện nay thường được thực hiện ở phía ứng dụng, giảm nhu cầu sử dụng tính năng này.

Loại bỏ ZEROFILL

The ZEROFILL option was also deprecated in the same version. Although ZEROFILL was convenient for padding numbers with leading zeros, it is no longer recommended for the following reasons:

  • Các phương pháp thay thế phổ biến:
  • Zero-padding can now be easily handled in the application or UI layer.
  • Tránh gây nhầm lẫn:
  • The automatic application of the UNSIGNED attribute when using ZEROFILL caused confusion for beginner users.

Cách Thích Ứng Với Việc Loại Bỏ

In response to these deprecations, consider the following approaches in database design:

  1. Xử lý định dạng trong lớp ứng dụng:
  • Perform zero-padding and formatting in the application or presentation layer.
  • Example: Implement zero-padding using PHP or JavaScript.
  1. Áp dụng thiết kế không phụ thuộc vào độ rộng hiển thị:
  • Define the INT type without specifying M and focus on data accuracy rather than display formatting.

6. Phần Câu Hỏi Thực Tế

Các Câu Hỏi Thường Gặp

Câu hỏi 1. Điều gì xảy ra nếu tôi lưu một giá trị vượt quá mức tối đa của kiểu INT?
A. Trong MySQL, khi cố gắng lưu một giá trị ngoài phạm vi của kiểu INT sẽ gây ra lỗi. Bạn phải chọn một giá trị nằm trong phạm vi hỗ trợ hoặc chuyển sang kiểu dữ liệu có phạm vi lớn hơn (ví dụ, BIGINT).

Câu hỏi 2. Sự khác biệt giữa INT và BIGINT là gì?
A. Kiểu BIGINT sử dụng gấp đôi dung lượng lưu trữ so với INT (8 byte) và cung cấp một phạm vi số rất rộng. Ví dụ, phạm vi có dấu của BIGINT vượt quá ±9 quintillion, khiến nó phù hợp để xử lý các bộ dữ liệu rất lớn.

Câu hỏi 3. Sau khi ZEROFILL bị loại bỏ, tôi nên thực hiện hiển thị có đệm số 0 như thế nào?
A. Khuyến nghị thực hiện việc đệm số 0 trong lớp ứng dụng. Ví dụ, trong PHP bạn có thể dùng hàm str_pad(), và trong JavaScript bạn có thể dùng phương thức padStart() để thực hiện đệm số 0.

Câu hỏi 4. Tôi nên chọn giữa INT và các kiểu số nguyên khác như thế nào?
A. Chọn kiểu dựa trên phạm vi dữ liệu. Các giá trị số nhỏ (ví dụ, tuổi hoặc điểm) phù hợp với TINYINT, dữ liệu quy mô trung bình (ví dụ, ID người dùng) phù hợp với INT, và các giá trị rất lớn (ví dụ, dữ liệu giao dịch tài chính) phù hợp với BIGINT.

7. Kết Luận

Trong bài viết này, chúng tôi đã cung cấp giải thích chi tiết về kiểu dữ liệu INT của MySQL. Các điểm chính như sau:

  • Hiểu sự khác biệt giữa các giá trị tối đa và tối thiểu có dấu và không dấu của kiểu INT là nền tảng cho thiết kế dữ liệu đúng.
  • Việc hiểu các phương pháp thay thế cho các tùy chọn “độ rộng hiển thị (M)” và “ZEROFILL” đã bị loại bỏ và thiết kế cơ sở dữ liệu có thể thích ứng với các cập nhật MySQL trong tương lai là rất quan trọng.
  • Chọn kiểu số nguyên phù hợp dựa trên đặc điểm dữ liệu để xây dựng một cơ sở dữ liệu hiệu quả và dễ bảo trì.

Sử dụng bài viết này làm tài liệu tham khảo để tối ưu việc sử dụng kiểu INT và nâng cao hiệu quả trong thiết kế cơ sở dữ liệu MySQL.