Trong mấy năm làm việc với MySQL, có một thời gian dài tôi không để ý đến thuộc tính ZEROFILL và UNSIGNED của MySQL cho đến khi cần sử dụng ZEROFILL cho một ứng dụng nào đó
Những thuộc tính này là gì? . ZEROFILL dùng để điền số 0 vào một số nguyên sao cho tất cả các số trong cột có cùng số chữ số
Với những gì họ đang có, unsigned có nghĩa là "không có dấu hiệu", tôi. e. không có dấu trừ [-] nên chỉ lưu số dương. Trong khi điền vào số không được sử dụng cụ thể hơn để điền vào các số không ở bên trái trong trường hợp này
Tại sao nên sử dụng UNSIGNED
Nhiều nhà phát triển không quan tâm đến việc điều chỉnh các thuộc tính như thế này vì ngay cả khi họ sai, hầu hết thời gian họ không phá vỡ ứng dụng
Nhưng dù sao đi nữa, luôn có cách phù hợp để thực hiện và trong trường hợp này, cách tối ưu nhất sẽ mang lại cho chúng tôi tính nhất quán hơn trong cơ sở dữ liệu của mình và tiết kiệm dung lượng cho khối lượng dữ liệu lớn hơn
Luôn sử dụng UNSIGNED để biểu thị toàn bộ giá trị sẽ không bao giờ âm. Ví dụ: id AUTO_INCREMENT bắt đầu từ 1 sẽ không bao giờ âm
Ưu điểm chính của việc sử dụng thuộc tính này là MySQL sẽ không phân bổ không gian không cần thiết cho các số âm từ -2147483648 đến 0 và sẽ nhân đôi không gian cho các số dương từ 0 đến 4294967295. Nguồn. mysql
Tại sao nên sử dụng ZEROFILL
Vai trò của thuộc tính ZEROFILL chỉ là để cho MySQL biết thông tin sẽ được hiển thị như thế nào. Nó không ảnh hưởng đến cách dữ liệu được lưu trữ
Nếu bạn cần thực hiện một WHERE 0001=1
, SQL sẽ vẫn hoạt động như mong đợi
Do đó, chỉ vì mục đích thẩm mỹ, bạn có thể sử dụng thuộc tính này để luôn có sự nhất quán về các chữ số của số nguyên trong ứng dụng của mình. Theo tôi, không có gì không thể giải quyết được ở giao diện người dùng, nhưng nếu bạn muốn giữ chế độ xem của các cột có dữ liệu ở định dạng 00010, 00011, 00012, v.v. nó hợp lệ để sử dụng phương pháp này
Số không với ZEROFILL
Để chỉ định bạn muốn hiển thị bao nhiêu số 0 ở đầu, bạn cần chỉ định kích thước cột khi tạo hoặc thay đổi bảng, chẳng hạn. INT[5]. Xem các đoạn tiếp theo để biết cách tạo hoặc thay đổi bảng
Nếu là số lớn hơn 5 thì số đó không bị cắt bỏ mà hiển thị bình thường từ 6 chữ số trở lên. Và nếu nó nhỏ hơn, nó sẽ chứa đầy số không
Hành vi này của INT[5] chỉ nhằm mục đích xem vì một số nguyên luôn có cùng kích thước, nhưng tôi hiểu rằng nó hoàn toàn khác với VARCHAR[5], trong đó chuỗi bị cắt và tôi đồng ý rằng điều này hơi khó hiểu
Sửa đổi một bảng hiện có
Để thay đổi thuộc tính UNSIGNED hoặc ZEROFILL trong bảng bạn đã tạo, hãy sử dụng cú pháp ALTER TABLE
ALTER TABLE table_name MODIFY COLUMN column_name INT { NOT NULL | UNSIGNED | ZEROFILL | DEFAULT };
CHƯA KÝ
Ví dụ: lệnh bên dưới sẽ thay đổi số bảng và cột thành UNSIGNED. Giữ dữ liệu nếu cột đã có kiểu INT
Cảnh báo. Bạn cũng phải sửa đổi DEFAULT, NOT_NULL và AUTO_INCREMENT nếu có. Nếu bạn không chỉ định các thuộc tính này, chúng sẽ được sửa đổi thành mặc định của MySQL. Cân nhắc kiểm tra bằng bảng kiểm tra trước khi thay đổi dữ liệu quan trọng
cảnh báo 2. Mọi số âm được lưu trữ trong cột này sẽ được chuyển đổi thành "0", vì vậy hãy thận trọng khi sử dụng
ALTER TABLE table_name MODIFY column_name INT UNSIGNED NOT NULL;
ZEROFILL
Như đã nêu ở trên, khi một cột có ZEROFILL, nó sẽ tự động được chọn UNSIGNED
Lưu ý rằng sự khác biệt duy nhất trong ví dụ để thay đổi thành không dấu là tôi đã sử dụng kích thước/chiều dài trong INT, với chiều rộng 5 chữ số. Điều này không có nghĩa là bạn sẽ có thể nhập các số có tối đa 5 chữ số hoặc bạn sẽ mất dữ liệu lớn hơn 99999, mà nó chỉ có nghĩa là MySQL sẽ luôn cố gắng điền các số 0 cho đến khi đủ 5 chữ số, e. g. 00123
Cảnh báo. Bạn cũng phải sửa đổi DEFAULT, NOT_NULL và AUTO_INCREMENT nếu có. Nếu bạn không chỉ định các thuộc tính này, chúng sẽ được sửa đổi thành mặc định của MySQL. Cân nhắc kiểm tra bằng bảng kiểm tra trước khi thay đổi dữ liệu quan trọng
cảnh báo 2. Mọi số âm được lưu trữ trong cột này sẽ được chuyển đổi thành "0" do chuyển đổi không dấu tự động, vì vậy hãy thận trọng khi sử dụng số này
ALTER TABLE table_name MODIFY column_name INT[5] ZEROFILL NOT NULL;
Tạo cột với ZEROFILL và UNSIGNED
Ví dụ này chỉ mang tính chất tham khảo vì chúng ta cũng làm tương tự như trong ALTER TABLE
Để tạo một bảng xác định các thuộc tính này dễ dàng hơn là sửa đổi một bảng hiện có vì bạn không phải lo lắng về việc mất dữ liệu [trong trường hợp số âm]
Dưới đây là mã để tạo bảng bằng ZEROFILL và do đó UNSIGNED. Để thay đổi kích thước định dạng của các số không, hãy thay đổi kích thước hiển thị của số nguyên trong INT[5]