Lợi ích của zerofill trong MySQL là gì?


168

Tôi chỉ muốn biết lợi ích / cách sử dụng định nghĩa ZEROFILLcho INTDataType là MySQLgì?

`id` INT UNSIGNED ZEROFILL NOT NULL 


Câu hỏi hay. Các câu hỏi liên quan cũng có thể được hỏi: Có lý do chính đáng nào để không sử dụng ZEROFILL không? Những hạn chế và cạm bẫy tiềm năng của việc sử dụng ZEROFILL là gì? Do lợi ích vượt trội hơn những nhược điểm?
spencer7593

Xem phần giải thích stackoverflow.com/questions/5634104/
Mạnh

Câu trả lời:


254

Khi bạn chọn một cột có kiểu, ZEROFILLnó 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 ZEROFILLcũng ngụ ý UNSIGNED.

Sử dụng ZEROFILLvà 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

52
@diEcho: Ví dụ: nếu bạn muốn tất cả các số hóa đơn của mình được hiển thị với 10 chữ số thì bạn có thể khai báo loại cột đó là INT (10) ZEROFILL.
Mark Byers

76
Tôi đặc biệt khuyên bạn nên tránh xa tính năng này - làm thế nào một giá trị số được hiển thị / định dạng là mối quan tâm về trình bày và hoàn toàn không phải là thứ thuộc về cấp độ cơ sở dữ liệu; ít nhất là không nếu bạn đang sử dụng cơ sở dữ liệu để sao lưu một phần mềm. Xin lưu ý rằng điều này có thể gây ra sự cố - nếu bạn phân tích một giá trị với số 0 đứng đầu là số nguyên, nhiều trình phân tích cú pháp sẽ coi giá trị đó là số bát phân, có thể không phải là điều bạn muốn. Lần duy nhất bạn nên sử dụng tính năng này, là tối ưu hóa (lưu trữ), khi những gì bạn thực sự lưu trữ thực sự là một chuỗi các chữ số (có độ dài cố định).
mindplay.dk

3
@ mindplay.dk: Phụ thuộc. Nếu bạn đang lưu trữ một cái gì đó như GTIN, chúng phải dài 14 chữ số nhưng cũng có thể chỉ có 8 chữ số và được đệm bằng số không. Dựa vào phía đầu ra sẽ không đúng trong trường hợp này, bởi vì nó không chỉ đơn giản là một số thập phân, mà là một khóa.
Danman

1
@MarkByer, nói một cách thực tế, hầu hết các thư viện khách (ví dụ PHP) sẽ chỉ đơn giản là loại bỏ các số không trước khi họ giao nó cho mã ứng dụng? Nếu vậy, thì nó thực sự có vẻ hơi vô nghĩa. Một thiết kế tồi trong những ngày đầu của MySQL.
Pacerier

131

Một ví dụ để hiểu, nơi sử dụng ZEROFILLcó 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 đó, 80337mã zip hợp lệ cho munic, 01067là 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 1067trô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) ZEROFILLtrong khi số nguyên zerofiled có hai lợi thế lớn:

  1. Không gian lưu trữ ít hơn trên đĩa cứng
  2. Nếu bạn chèn 1067, bạn vẫn nhận được 01067trở lại

Có lẽ ví dụ này giúp hiểu được việc sử dụng ZEROFILL.


10
Đáng để thêm rằng máy khách SQL hiển thị dữ liệu có trách nhiệm định dạng các số có các số 0 đứng đầu. Đây không phải là điều "tự động" xảy ra với mỗi và mọi ứng dụng truy xuất dữ liệu.
a_horse_with_no_name

Các cột có chiều rộng cố định cũng tốt hơn, vì chúng làm giảm sự phân mảnh trên đĩa.
DanMan

@Phil, thực tế mà nói, hầu hết các thư viện máy khách (ví dụ PHP) chỉ đơn giản là loại bỏ các số không trước khi chúng trao nó cho mã ứng dụng? Nếu vậy, thì nó thực sự có vẻ hơi vô nghĩa. Một thiết kế tồi trong những ngày đầu của MySQL.
Pacerier

3
@Pacerier Điều này phụ thuộc vào cách bạn muốn dữ liệu trong thư viện máy khách của mình được thể hiện: Dưới dạng số hoặc dưới dạng chuỗi. Mã zip tiếng Đức không phải là một số, nó chỉ là một chuỗi gồm các chữ số. Do đó, tôi không đồng ý với tuyên bố của bạn về thiết kế tồi trong những ngày đầu của MySQL. Đó vẫn là một cách tiếp cận hợp lệ nhưng đối với các trường hợp hiếm.
Phil

61

Đâ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

15

Nó giúp sắp xếp chính xác trong trường hợp bạn sẽ cần ghép "số nguyên" này với một số khác (một số hoặc văn bản khác) sẽ yêu cầu được sắp xếp thành một "văn bản" sau đó.

ví dụ,

nếu bạn sẽ cần sử dụng các số trường nguyên (giả sử 5) được ghép nối thành A-005 hoặc 10/0005


4

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)


1
Cảm ơn, nhưng thật không may, tôi vừa thực hiện một số thử nghiệm đối với db mysql và nó không có giá trị null zerofill: - /. Mục tiêu đó vẫn được thực hiện bằng cách ràng buộc trường không cho phép null. Tôi nên biết rõ hơn là thử và trả lời các câu hỏi về dbs mà tôi không thường sử dụng. Gonna xóa câu trả lời của tôi trước khi mọi người quá hài lòng. lol
Marlin

1
Hữu ích? Không đúng. Zerofill không làm gì cả (ngoại trừ thêm Chưa ký) khi thời lượng hiển thị là 1.
Brilliand

@Marlin và bạn phải luôn luôn đặt giá trị mặc định là đúng hoặc sai ... nếu bạn không sử dụng các giá trị mặc định thì vấn đề bạn đề cập sẽ KHÔNG phải là duy nhất ... KHÔNG phải là NULL cũng phải :)
bakriawad

Tôi sẽ downvote nhưng đại diện của bạn là 666vì vậy tôi muốn giữ câu trả lời này như là;-)
Martin

3
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)

1

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.

http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html


thay vào đó, liên kết sẽ là dev.mysql.com/doc/refman/5.0/en/numeric-type-attribut.html thay vào đó
arhak

1

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.


0

SỐ KHÔNG

Điều này về cơ bản có nghĩa là nếu giá trị số nguyên 23 được chèn vào cột INT có chiều rộng bằng 8 thì phần còn lại của vị trí khả dụng sẽ được tự động đệm bằng số không.

Vì thế

23

trở thành:

00000023
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.