Khi nào tôi nên sử dụng UNSIGNED và SIGNED INT trong MySQL?


100

Khi nào tôi nên sử dụng UNSIGNED và SIGNED INT trong MySQL? Điều gì tốt hơn để sử dụng hay đây chỉ là sở thích cá nhân? Bởi vì tôi đã thấy nó được sử dụng như thế này;

id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT

id INT(11) NOT NULL AUTO_INCREMENT

4
Tiêu cực PK làm không nhiều ý nghĩa
zerkms

Câu trả lời:


163

UNSIGNEDchỉ lưu trữ các số dương (hoặc số 0). Mặt khác, có dấu có thể lưu trữ số âm (nghĩa là, có thể có một dấu âm ).

Dưới đây là bảng các phạm vi giá trị mà mỗi INTEGERloại có thể lưu trữ:

Các kiểu và độ dài của MySQL INTEGER
Nguồn: http://dev.mysql.com/doc/refman/5.6/en/integer-types.html

UNSIGNEDphạm vi từ 0đến n, trong khi đã ký có phạm vi từ sắp -n/2đến n/2.

Trong trường hợp này, bạn có một AUTO_INCREMENTcột ID, vì vậy bạn sẽ không có phủ định. Như vậy, sử dụng UNSIGNED. Nếu bạn không sử dụng UNSIGNEDcho AUTO_INCREMENTcột, giá trị tối đa có thể của bạn sẽ cao bằng một nửa (và nửa âm của dải giá trị sẽ không được sử dụng).


14
Tuy nhiên, hãy lưu ý rằng đó UNSIGNEDlà tính năng dành riêng cho MySQL và không phải là một tính năng SQL tiêu chuẩn. Điều này có nghĩa là việc sử dụng UNSIGNEDcó thể làm cho việc di chuyển trong tương lai sang một RDBMS khác phức tạp hơn hoặc khiến bạn gặp khó khăn khi sử dụng các thư viện phần mềm nhắm mục tiêu SQL tiêu chuẩn như SQLAlchemy. Tôi nghĩ đây phải là một phần của câu trả lời.
minexew 14/09/18


4

Về cơ bản UNSIGNED, bạn đang cung cấp cho mình gấp đôi không gian cho số nguyên vì bạn chỉ định rõ ràng rằng bạn không cần số âm (thường là vì các giá trị bạn lưu trữ sẽ không bao giờ âm).


1

Tôi không đồng ý với cp vipin .

Sự thật là bit đầu tiên được sử dụng để biểu diễn dấu hiệu. Nhưng 1 là giá trị âm và 0 là giá trị dương. Nhiều giá trị âm hơn được mã hóa theo cách khác nhau (bổ sung của hai). Ví dụ với TINYINT:

The sign bit
|
1000 0000b = -128d  
...  
1111 1101b = -3d  
1111 1110b = -2d  
1111 1111b = -1d  

0000 0000b = 0d  
0000 0001b = 1d  
0000 0010b = 2d  
...  
0111 1111b = 127d  

1

Đối với giá trị số nguyên âm, SIGNEDđược sử dụng và đối với giá trị số nguyên không âm, UNSIGNEDđược sử dụng. Nó luôn được đề xuất sử dụng UNSIGNEDcho id làm KHÓA CHÍNH.


0

Một điều tôi muốn thêm Trong a signed int, là dấu default value in mysql, 1 bitsẽ được sử dụng để đại diện sign. -1 for negative and 0 for positive. Vì vậy, nếu ứng dụng của bạn chỉ chèn giá trị dương thì tốt hơn nên chỉ định không dấu.


0

Nếu bạn biết loại số bạn sẽ lưu trữ, bạn có thể chọn cho phù hợp. Trong trường hợp này, bạn có 'id' không bao giờ có thể là số âm. Vì vậy, bạn có thể sử dụng int unsigned. Phạm vi int có dấu: -n / 2 đến + n / 2 Phạm vi int không dấu: 0 đến n Vì vậy, bạn có gấp đôi số dương có sẵn. Chọn cho phù hợp.


0

Tôi nghĩ, UNSIGNEDsẽ là lựa chọn tốt nhất để lưu trữ giá trị như time_duration(Ví dụ resolved_call_time = resolved_time(DateTime)-creation_time(DateTime):) ở định dạng phút hoặc giờ hoặc giây chắc chắn sẽ là một số không âm

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.