Tôi chỉ muốn biết lợi ích / cách sử dụng định nghĩa ZEROFILL
cho INT
DataType là MySQL
gì?
`id` INT UNSIGNED ZEROFILL NOT NULL
Tôi chỉ muốn biết lợi ích / cách sử dụng định nghĩa ZEROFILL
cho INT
DataType là MySQL
gì?
`id` INT UNSIGNED ZEROFILL NOT NULL
Câu trả lời:
Khi bạn chọn một cột có kiểu, ZEROFILL
nó sẽ đệm giá trị được hiển thị của trường với các số không lên đến chiều rộng hiển thị được chỉ định trong định nghĩa cột. Các giá trị dài hơn chiều rộng màn hình không bị cắt ngắn. Lưu ý rằng việc sử dụng ZEROFILL
cũng ngụ ý UNSIGNED
.
Sử dụng ZEROFILL
và chiều rộng hiển thị không ảnh hưởng đến cách lưu trữ dữ liệu. Nó chỉ ảnh hưởng đến cách nó được hiển thị.
Dưới đây là một số ví dụ SQL thể hiện việc sử dụng ZEROFILL
:
CREATE TABLE yourtable (x INT(8) ZEROFILL NOT NULL, y INT(8) NOT NULL);
INSERT INTO yourtable (x,y) VALUES
(1, 1),
(12, 12),
(123, 123),
(123456789, 123456789);
SELECT x, y FROM yourtable;
Kết quả:
x y
00000001 1
00000012 12
00000123 123
123456789 123456789
Một ví dụ để hiểu, nơi sử dụng ZEROFILL
có thể thú vị:
Ở Đức, chúng tôi có mã zip gồm 5 chữ số. Tuy nhiên, các Mã đó có thể bắt đầu bằng Số không, do đó, 80337
mã zip hợp lệ cho munic, 01067
là mã zip của Berlin.
Như bạn thấy, bất kỳ công dân Đức nào cũng mong muốn mã zip được hiển thị dưới dạng mã gồm 5 chữ số, vì vậy 1067
trông rất lạ.
Để lưu trữ những dữ liệu đó, bạn có thể sử dụng một VARCHAR(5)
hoặc INT(5) ZEROFILL
trong khi số nguyên zerofiled có hai lợi thế lớn:
1067
, bạn vẫn nhận được 01067
trở lạiCó lẽ ví dụ này giúp hiểu được việc sử dụng ZEROFILL
.
Đây là một tính năng cho những người cá tính, những người thích hộp vuông.
Bạn chèn
1
23
123
nhưng khi bạn chọn, nó đệm các giá trị
000001
000023
000123
Tôi biết tôi đến bữa tiệc muộn nhưng tôi thấy zerofill rất hữu ích cho các đại diện boolean của TINYINT (1). Null không phải lúc nào cũng có nghĩa là Sai, đôi khi bạn không muốn nó. Bằng cách cung cấp một số tiền nhỏ, bạn chuyển đổi hiệu quả các giá trị đó thành INT và loại bỏ bất kỳ ứng dụng nào có thể gây nhầm lẫn khi tương tác. Sau đó, ứng dụng của bạn có thể xử lý các giá trị đó theo cách tương tự như kiểu dữ liệu nguyên thủy True = Not (0)
666
vì vậy tôi muốn giữ câu trả lời này như là;-)
mysql> CREATE TABLE tin3(id int PRIMARY KEY,val TINYINT(10) ZEROFILL);
Query OK, 0 rows affected (0.04 sec)
mysql> INSERT INTO tin3 VALUES(1,12),(2,7),(4,101);
Query OK, 3 rows affected (0.02 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM tin3;
+----+------------+
| id | val |
+----+------------+
| 1 | 0000000012 |
| 2 | 0000000007 |
| 4 | 0000000101 |
+----+------------+
3 rows in set (0.00 sec)
mysql>
mysql> SELECT LENGTH(val) FROM tin3 WHERE id=2;
+-------------+
| LENGTH(val) |
+-------------+
| 10 |
+-------------+
1 row in set (0.01 sec)
mysql> SELECT val+1 FROM tin3 WHERE id=2;
+-------+
| val+1 |
+-------+
| 8 |
+-------+
1 row in set (0.00 sec)
Khi được sử dụng cùng với ZEROFILL thuộc tính tùy chọn (không chuẩn), phần đệm mặc định của khoảng trắng được thay thế bằng số không. Ví dụ: đối với một cột được khai báo là INT (4) ZEROFILL, giá trị 5 được lấy là 0005.
Nếu bạn chỉ định ZEROFILL cho một cột số, MySQL sẽ tự động thêm thuộc tính UNSIGNED vào cột.
Các kiểu dữ liệu số cho phép thuộc tính UNSIGNED cũng cho phép ĐĂNG KÝ. Tuy nhiên, các loại dữ liệu này được ký theo mặc định, vì vậy thuộc tính SẮC KÝ không có hiệu lực.
Mô tả trên được lấy từ trang web chính thức của MYSQL.
zerofill
là phi tiêu chuẩn. " CácZEROFILL
thuộc tính được bỏ qua khi một cột được tham gia trong các biểu thức hoặcUNION
truy vấn. Nếu bạn lưu trữ các giá trị lớn hơn chiều rộng hiển thị trong một cột số nguyên mà cóZEROFILL
thuộc tính, bạn có thể gặp vấn đề khi MySQL tạo bảng tạm thời đối với một số phức tạp tham gia. Trong những trường hợp , MySQL giả định rằng các giá trị dữ liệu phù hợp với chiều rộng hiển thị của cột. "