Kapan saya harus menggunakan UNSIGNED dan SIGNED INT di MySQL?


100

Kapan saya harus menggunakan UNSIGNED dan SIGNED INT di MySQL? Apa yang lebih baik untuk digunakan atau ini hanya preferensi pribadi? Karena saya pernah melihatnya digunakan seperti ini;

id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT

dan

id INT(11) NOT NULL AUTO_INCREMENT

4
PK negatif tidak masuk akal
zerkms

Jawaban:


163

UNSIGNEDhanya menyimpan bilangan positif (atau nol). Di sisi lain, bertanda dapat menyimpan angka negatif (misalnya, mungkin memiliki tanda negatif ).

Berikut adalah tabel rentang nilai yang INTEGERdapat disimpan setiap jenis:

Jenis dan panjang INTEGER MySQL
Sumber: http://dev.mysql.com/doc/refman/5.6/en/integer-types.html

UNSIGNEDberkisar dari 0sampai n, sementara yang ditandatangani berkisar dari kira -n/2- kira sampai n/2.

Dalam hal ini, Anda memiliki AUTO_INCREMENTkolom ID, jadi Anda tidak akan memiliki negatif. Jadi, gunakan UNSIGNED. Jika Anda tidak menggunakan UNSIGNEDuntuk AUTO_INCREMENTkolom, nilai maksimum Anda yang mungkin adalah setengahnya (dan setengah negatif dari rentang nilai tidak akan digunakan).


14
Perhatikan, bagaimanapun, itu UNSIGNEDkhusus MySQL dan bukan fitur SQL standar. Ini berarti bahwa penggunaan UNSIGNEDdapat membuat migrasi di masa mendatang ke RDBMS yang berbeda menjadi lebih rumit atau menyebabkan Anda kesulitan saat menggunakan pustaka perangkat lunak yang menargetkan SQL standar seperti SQLAlchemy. Saya pikir ini harus menjadi bagian dari jawabannya.
Minexew


4

Pada dasarnya UNSIGNED, Anda memberi diri Anda ruang dua kali lebih banyak untuk bilangan bulat karena Anda secara eksplisit menentukan bahwa Anda tidak memerlukan angka negatif (biasanya karena nilai yang Anda simpan tidak akan pernah negatif).


1

Saya tidak setuju dengan vipin cp .

Yang benar adalah bit pertama digunakan untuk mewakili tanda. Tetapi 1 untuk negatif dan 0 untuk nilai positif. Lebih dari nilai negatif dikodekan dengan cara yang berbeda (komplemen dua). Contoh dengan 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

Untuk nilai integer negatif, SIGNEDdigunakan dan untuk nilai integer non-negatif, UNSIGNEDdigunakan. Itu selalu disarankan untuk menggunakan UNSIGNEDid sebagai KUNCI UTAMA.


0

Satu hal yang ingin saya tambahkan dalam a signed int, yaitu default value in mysql, 1 bitakan digunakan untuk mewakili sign. -1 for negative and 0 for positive. Jadi, jika aplikasi Anda hanya memasukkan nilai positif, sebaiknya gunakan unsigned.


0

Jika Anda mengetahui jenis nomor yang akan Anda simpan, Anda dapat memilih yang sesuai. Dalam hal ini Anda memiliki 'id' yang tidak pernah bisa negatif. Jadi Anda bisa menggunakan unsigned int. Rentang int bertanda tangan: -n / 2 hingga + n / 2 Rentang unsigned int: 0 hingga n Jadi Anda memiliki dua kali jumlah bilangan positif yang tersedia. Pilih yang sesuai.


0

Saya pikir, UNSIGNEDakan menjadi pilihan terbaik untuk menyimpan sesuatu seperti time_duration(Misalnya :) resolved_call_time = resolved_time(DateTime)-creation_time(DateTime)nilai dalam format menit atau jam atau detik yang pasti akan menjadi angka non-negatif

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.