Lưu ý rằng với UNSIGNED
, về cơ bản, bạn đang dành cho mình gấp đôi dung lượng cho số nguyên vì bạn chỉ định rõ ràng rằng bạn không cần số âm
Khi quyết định sử dụng SIGNED
hoặc UNSIGNED
cho một trường, hãy tự hỏi liệu trường này có bao giờ chứa giá trị âm hay không. Nếu câu trả lời là không, thì bạn muốn có kiểu dữ liệu UNSIGNED
. Một trường hợp sử dụng phổ biến cho UNSIGNED
là dành cho các trường id tăng tự động trong một bảng
Để chỉ định cột id tăng tự động UNSIGNED
SIGNED
3Để chỉ định một cột SIGNED
SIGNED
5 để thể hiện lợi nhuận từ các khoản đầu tư
SIGNED
6Vì cột SIGNED
5 có thể lấy các giá trị âm để thể hiện các khoản lỗ đối với các khoản đầu tư, chúng tôi đã chỉ định cột là SIGNED
Trong bài viết các bạn sẽ tìm hiểu về kiểu dữ liệu số nguyên SIGNED và UNSIGNED trong MySQL. Bài viết cung cấp thông tin về các loại số nguyên với các thuộc tính ZEROFILL, AUTO_INCREMENT và display_width, cũng như mô tả các ví dụ về thời điểm và cách sử dụng các loại dữ liệu số nguyên
nội dung
MySQL INTEGER là gì
Trong MySQL, INTEGER [INT] là một giá trị số không có phần thập phân. Nó định nghĩa các số nguyên có thể được lưu trữ trong một trường hoặc cột. Ngoài ra, MySQL hỗ trợ thuộc tính display_width [ví dụ: INT[1]] và thuộc tính ZEROFILL, tự động thêm số 0 vào giá trị tùy thuộc vào độ rộng hiển thị
Ngoại trừ các kiểu dữ liệu INT và SMALLINT tiêu chuẩn, MySQL hỗ trợ các kiểu dữ liệu số TINYINT, MEDIUMINT và BIGINT có thể ĐƯỢC KÝ và KHÔNG KÝ
Bảng hiển thị dung lượng lưu trữ được phép theo byte, giá trị tối đa và tối thiểu của các kiểu dữ liệu số nguyên ĐÃ KÝ và KHÔNG KÝ
TypStorage [byte] Giá trị tối thiểu có dấu hiệu giá trị unsignedMaxImum Giá trị có dấu hiệu không dấu unsignedtinyint1-128012725555Thông thường, các loại dữ liệu INTEGER được sử dụng để biểu thị ID, ngày và giờ [ví dụ: DATETIME, DATE, YEAR, TIMESTAMP], các thuộc tính chiều rộng và chiều cao, v.v.
ĐÃ KÝ vs CHƯA KÝ
Như đã đề cập trước đó, kiểu dữ liệu INTEGER có thể KHÔNG KÝ và ĐÃ KÝ. UNSIGNED chỉ có thể lưu số 0 và số dương trong một cột. Nếu các giá trị trong cột không bao giờ sử dụng số âm hoặc khi có nhu cầu sử dụng phạm vi số phía trên lớn hơn cho cột, bạn có thể đặt UNSIGNED, do đó có thể giúp lập chỉ mục nhanh hơn
SIGNED có thể cho phép số không, số dương và số âm. Với giá trị MySQL là SIGNED, một bit được lấy cho ký hiệu dấu trái ngược với ký hiệu không dấu, khi chúng không có dấu trước giá trị
Trong MySQL, INT thường được chọn làm khóa chính và có thể có thuộc tính AUTO_INCREMENT trong cột. Ví dụ: khi bạn thêm NULL hoặc 0 vào thuộc tính INT AUTO_INCREMENT, giá trị cột sẽ tự động tăng lên và thay đổi thành giá trị tuần tự tiếp theo được tạo theo thứ tự tăng dần. Khi bạn thêm một giá trị khác 0 vào thuộc tính INT AUTO_INCREMENT, giá trị này được chấp nhận và trình tự được đặt lại, nghĩa là giá trị được chèn đứng trước các giá trị trình tự được tạo tự động [i. e. giá trị+1]. Hãy nhớ rằng các cột có AUTO_INCREMENT không lưu trữ giá trị âm, điều đó có nghĩa là các cột có AUTO_INCREMENT không được ký theo mặc định
Kiểu dữ liệu UNSIGNED INT là gì?
Khi chúng tôi đặt cột MySQL INT UNSIGNED, điều đó có nghĩa là không thể chèn các giá trị âm vào cột này. Giá trị phạm vi tối đa với loại dữ liệu UNSIGNED là 4294967295, trong khi giá trị nhỏ nhất là 0. Do đó, nếu bạn chèn một giá trị âm hoặc một giá trị vượt quá giá trị tối đa, bạn sẽ gặp lỗi vì đó sẽ là giá trị nằm ngoài phạm vi. Hãy xem ví dụ về cách tạo bảng với các cột INT UNSIGNED. Vì ID thường là kiểu dữ liệu số nên chúng tôi sẽ sử dụng nó làm khóa chính INT UNSIGNED
Tạo một bảng với ví dụ dữ liệu UNSIGNED
Đối với một ví dụ demo, chúng tôi sẽ sử dụng dbForge Studio cho MySQL
Để bắt đầu, hãy tạo bảng sản phẩm có total_amount làm kiểu dữ liệu INT UNSIGNED. Đối với điều này, trên thanh công cụ tiêu chuẩn, hãy nhấp vào SQL mới, nhập truy vấn và nhấp vào Thực thi hoặc nhấn F5
Sau đó, chèn một hàng mới – GIÁ TRỊ – vào bảng MySQL và thực hiện truy vấn
Để kiểm tra kết quả, truy xuất dữ liệu. Đối với điều này, trong Database Explorer, nhấp chuột phải vào bảng sản phẩm và chọn Truy xuất dữ liệu. Như bạn có thể thấy, các giá trị đã được thêm vào
Và bây giờ, hãy chèn một hàng mới nhưng có số âm cho cột INT UNSIGNED và thực hiện truy vấn
INSERT INTO products [product_id, product_item, category, total_amount]
VALUES [2, 'apples', 'fruits', -5];
Như bạn có thể thấy, khi thực hiện truy vấn, chúng tôi gặp lỗi vì UNSIGNED không hỗ trợ các giá trị âm
INTEGER Chiều rộng màn hình. INT[]
Trong MySQL, bạn có thể đặt độ rộng hiển thị cho kiểu dữ liệu INT. Chiều rộng hiển thị là số trong ngoặc đơn đại diện cho chiều dài đầu ra, i. e. có bao nhiêu ký tự sẽ được hiển thị trong cột khi lấy dữ liệu cho cột. Vì vậy, nó chỉ quan trọng khi hiển thị đầu ra
Hãy xem xét những điều sau đây. Nếu bạn chỉ định 5 làm giá trị cho các cột int[1], int[6], int[10] và int[11], tất cả chúng sẽ xuất ra cùng một giá trị – 5. Trên thực tế, chiều rộng hiển thị tạo ra sự khác biệt khi bạn đặt thuộc tính ZEROFILL. Trong trường hợp này, kết quả sẽ hiển thị lần lượt là 5, 000005, 0000000005 và 00000000005
Lưu ý rằng chiều rộng hiển thị không ảnh hưởng đến phạm vi giá trị tối đa và tối thiểu. Các giá trị tối thiểu và tối đa của cột và kích thước lưu trữ [tính bằng byte] chỉ phụ thuộc vào loại số nguyên bạn sử dụng chứ không phụ thuộc vào độ dài. Các giá trị int[1], int[6], int[10] và int[11] sẽ có giá trị lớn nhất trong phạm vi bằng 2147483647 [đối với INT có dấu] và 4294967295 [đối với INT không dấu]
MySQL INT với thuộc tính ZEROFILL
Nếu bạn cần thay khoảng trắng bằng số 0, bạn có thể sử dụng thuộc tính ZEROFILL cho cột MySQL INT UNSIGNED. Ví dụ cột INT[3] ZEROFILL có giá trị là 1 thì kết quả bạn lấy ra sẽ là 001
Ghi chú. Hãy nhớ rằng UNSIGNED sẽ tự động được thêm vào cột số
Hãy xem ví dụ. Chúng tôi tạo một bảng MySQL ProductsNew có các cột có thuộc tính ZEROFILL
Trong một tài liệu SQL mới, hãy thực thi câu lệnh CREATE sau
CREATE TABLE ProductsNew[
product_id INT AUTO_INCREMENT,
product_item varchar[255] NOT NULL,
category varchar[255] NOT NULL,
weight int[2] ZEROFILL,
review int[3] ZEROFILL,
PRIMARY KEY [product_id]
];
Sau đó, chèn một hàng mới vào bảng ProductsNew bằng cách sử dụng câu lệnh INSERT INTO và thực thi nó
INSERT INTO ProductsNew [product_id, product_item, category, weight, review]
VALUES [3, 'tomatoes', 'vegetables', 5, 7];
Truy xuất dữ liệu và kiểm tra kết quả
Hãy nhớ rằng đối với MySQL 8. 0. 17, thuộc tính ZEROFILL không được dùng cho các loại dữ liệu số
Các loại INT của MySQL
Như đã đề cập trước đó, MySQL hỗ trợ các kiểu dữ liệu chuẩn SQL INT và SMALLINT. Bên cạnh đó, MySQL hỗ trợ TINYINT, MEDIUMINT và BIGINT. Chọn kiểu dữ liệu số nguyên nào tùy thuộc vào dữ liệu bạn sẽ lưu trữ trong cột. Ví dụ: nếu bạn chắc chắn rằng giá trị trong cột sẽ không vượt quá giá trị tối đa trong phạm vi INT – 255, thì bạn có thể sử dụng kiểu dữ liệu TINYINT, do đó, sẽ cải thiện hiệu suất cơ sở dữ liệu. Tuy nhiên, nếu bạn cần lưu trữ dữ liệu khổng lồ chẳng hạn như cơ sở khách hàng sẽ không ngừng tăng lên, sẽ tốt hơn nếu bạn sử dụng INT hoặc BIGINT. Ngoài ra, nếu dữ liệu được lưu trữ trong cột sẽ không bao giờ sử dụng giá trị âm, thì nên đặt UNSIGNED. Phạm vi INT sẽ giống nhau, ví dụ: cho INT[5], INT[1], INT[100]
Chúng ta hãy xem xét từng loại dữ liệu số nguyên và các ví dụ về cách sử dụng chúng
Ví dụ TINYINT
TINYINT là một số nguyên rất nhỏ. Các giá trị SIGNED tối thiểu và tối đa lần lượt là -128 và 127, trong khi đối với các giá trị UNSIGNED phạm vi TINYINT là từ 0 đến 255. TINYINT sử dụng 1 byte mỗi hàng. Đây là lựa chọn tốt nhất khi bạn muốn tiết kiệm dung lượng trên đĩa và nâng cao hiệu suất
Xem xét ví dụ về cách sử dụng số nguyên TINYINT. Tạo bảng StudentGroup bằng câu lệnh CREATE
CREATE TABLE StudentGroup[
id tinyint AUTO_INCREMENT,
Name varchar[255] NOT NULL,
Surname varchar[255] NOT NULL,
Grade tinyint[4] UNSIGNED,
PRIMARY KEY [id]
];
Sau đó, chèn dữ liệu vào cột bằng câu lệnh INSERT
INSERT INTO StudentGroup [id, Name, Surname, Grade]
VALUES [1, 'John', 'Smith', 5];
Sau khi truy xuất dữ liệu, chúng tôi thấy rằng truy vấn đã được hoàn thành thành công
Nhưng nếu chúng tôi chèn giá trị không được bao gồm trong phạm vi và cố truy xuất dữ liệu,
INSERT INTO StudentGroup [id, Name, Surname, Grade]
VALUES [1, 'John', 'Smith', -5];
chúng ta sẽ gặp lỗi ‘Out of range value for column ‘Grade’ ở hàng 12′
Lưu ý rằng bắt đầu với MySQL 8. 0, chiều rộng hiển thị không được dùng cho TINYINT và bạn nên tính đến chiều rộng này khi chuyển sang phiên bản mới. Tuy nhiên, sự phản đối này không ảnh hưởng đến TINYINT[1], nhưng quan trọng đối với TINYINT[4]
NHỎ Ví dụ
SMALLINT là một số nguyên nhỏ. Phạm vi SMALLINT cho các giá trị ĐÃ KÝ là từ -32768 đến 32767. Các giá trị tối thiểu và tối đa cho SMALLINT UNSIGNED lần lượt là 0 và 65535. Kích thước là 2 byte mỗi hàng
Một ví dụ về cách sử dụng SMALLINT như sau. Tạo bảng SmallintTable bằng câu lệnh CREATE
CREATE TABLE SmallintTable[
ID smallint AUTO_INCREMENT,
value_1 smallint SIGNED,
value_2 smallint[6] UNSIGNED,
PRIMARY KEY [id]
];
Chèn các giá trị cột tương ứng với phạm vi SMALLINT và thực hiện truy vấn
INSERT INTO SmallintTable [ID, value_1, value_2]
VALUES [1, -768, 0];
Khi truy xuất dữ liệu, truy vấn đã hoàn thành mà không có lỗi
Bây giờ, hãy thay đổi các giá trị bằng cách chèn dữ liệu không có trong phạm vi NHỎ
Do đó, bạn sẽ thấy thông báo lỗi rằng các giá trị nằm ngoài phạm vi
Lưu ý rằng bắt đầu với MySQL 8. 0, chiều rộng hiển thị không được dùng cho SMALLINT và bạn nên tính đến chiều rộng này khi di chuyển sang phiên bản mới. Tuy nhiên, sự phản đối này không ảnh hưởng đến SMALLINT[1]
TRUNG BÌNH Ví dụ
MEDIUMINT là một số nguyên có kích thước trung bình. Các giá trị tối thiểu và tối đa cho MEDIUMINT SIGNED lần lượt là -8388608 và 8388607. Phạm vi cho các giá trị UNSIGNED tối thiểu và tối đa lần lượt bằng 0 và 16777215. Kích thước là 3 byte mỗi hàng
Một ví dụ về cách sử dụng MEDIUMINT như sau. Đầu tiên, tạo một bảng MediumIntTable bằng câu lệnh CREATE
CREATE TABLE MediumIntTable[
ID mediumint AUTO_INCREMENT,
value_1 mediumint,
value_2 mediumint[6] UNSIGNED,
PRIMARY KEY [ID]
];
Sau đó, thêm các giá trị chính xác vào truy vấn, truy xuất dữ liệu để xem mọi thứ có hoạt động chính xác không
CREATE TABLE ProductsNew[
product_id INT AUTO_INCREMENT,
product_item varchar[255] NOT NULL,
category varchar[255] NOT NULL,
weight int[2] ZEROFILL,
review int[3] ZEROFILL,
PRIMARY KEY [product_id]
];
0Sau đó, sửa đổi các giá trị thành giá trị vượt quá phạm vi cho phép.
CREATE TABLE ProductsNew[
product_id INT AUTO_INCREMENT,
product_item varchar[255] NOT NULL,
category varchar[255] NOT NULL,
weight int[2] ZEROFILL,
review int[3] ZEROFILL,
PRIMARY KEY [product_id]
];
1Do đó, thông báo lỗi thông báo rằng giá trị_2 nằm ngoài phạm vi xuất hiện
Lưu ý rằng bắt đầu với MySQL 8. 0, chiều rộng hiển thị không được dùng cho MEDIUMINT và bạn nên tính đến chiều rộng này khi di chuyển sang phiên bản mới. Tuy nhiên, sự phản đối này không ảnh hưởng đến MEDIUMINT[1]
Ví dụ BIGINT
BIGINT là một số nguyên lớn. Các giá trị tối thiểu và tối đa cho SIGNED lần lượt là – -263 và 263-1. Phạm vi cho các giá trị tối thiểu và tối đa cho UNSIGNED lần lượt bằng 0 và 264-1. Kích thước là 8 byte mỗi hàng
Một ví dụ về cách sử dụng BIGINT như sau. Hãy tạo một bảng BigIntTable với kiểu dữ liệu BIGINT và thuộc tính AUTO_INCREMENT cho cột ID. Sau đó, thêm vào truy vấn một số âm dưới dạng giá trị_1 và một số dương dưới dạng giá trị_2 được bao gồm trong phạm vi
CREATE TABLE ProductsNew[
product_id INT AUTO_INCREMENT,
product_item varchar[255] NOT NULL,
category varchar[255] NOT NULL,
weight int[2] ZEROFILL,
review int[3] ZEROFILL,
PRIMARY KEY [product_id]
];
2Sau đó, truy xuất dữ liệu để đảm bảo rằng nó hoạt động chính xác
Sau khi hoàn tất, hãy sửa đổi các giá trị thành giá trị vượt quá phạm vi cho phép
CREATE TABLE ProductsNew[
product_id INT AUTO_INCREMENT,
product_item varchar[255] NOT NULL,
category varchar[255] NOT NULL,
weight int[2] ZEROFILL,
review int[3] ZEROFILL,
PRIMARY KEY [product_id]
];
3Do đó, thông báo lỗi thông báo rằng giá trị_2 nằm ngoài phạm vi xuất hiện
Chúng tôi muốn đề cập rằng việc sử dụng INT làm khóa chính, khóa ngoại hoặc chỉ mục thay vì BIGINT có thể là một điểm quan trọng trong việc cải thiện hiệu suất, tiết kiệm dung lượng ổ đĩa và giảm kích thước chỉ mục
Lưu ý rằng bắt đầu với MySQL 8. 0, chiều rộng hiển thị không được dùng cho BIGINT và bạn nên tính đến chiều rộng này khi di chuyển sang phiên bản mới. Tuy nhiên, sự phản đối này không ảnh hưởng đến BIGINT[1]
Phần kết luận
Trong bài viết này, chúng ta đã xem xét các kiểu dữ liệu INTEGER của MySQL, các giá trị SIGNED và UNSIGNED, các thuộc tính AUTO_INCREMENT, ZEROFILL và display_width. Tùy thuộc vào dự án của bạn, bạn nên chọn kiểu dữ liệu INTEGER nào phù hợp với mình nhất. Ngoài ra, bài viết cung cấp các ví dụ về cách thức và thời điểm sử dụng kiểu dữ liệu INTEGER trong MySQL
Tải xuống phiên bản dùng thử miễn phí 30 ngày để dùng thử và đánh giá tất cả các tính năng nâng cao và có giá trị của dbForge Studio dành cho MySQL và các công cụ dbForge MySQL khác giúp cải thiện đáng kể hiệu suất của bạn, tối đa hóa năng suất và cho phép bạn xử lý các tác vụ quản lý và phát triển cơ sở dữ liệu một cách nhanh chóng và dễ dàng