MySQL'de ne zaman UNSIGNED ve SIGNED INT kullanmalıyım?


Yanıtlar:


169

UNSIGNEDyalnızca pozitif sayıları (veya sıfır) depolar. Öte yandan, işaretli negatif sayıları saklayabilir (yani, bir eksi işareti olabilir ).

Her INTEGERtürün depolayabileceği değer aralıklarının bir tablosu aşağıda verilmiştir :

MySQL INTEGER türleri ve uzunlukları
Kaynak: http://dev.mysql.com/doc/refman/5.6/en/integer-types.html

UNSIGNEDarasında değişmektedir 0için nyaklaşık aralıkları açmış durumdayken, -n/2hiç n/2.

Bu durumda, bir AUTO_INCREMENTkimlik sütununuz vardır, bu nedenle negatifleriniz olmaz. Bu nedenle kullanın UNSIGNED. Sütun UNSIGNEDiçin kullanmazsanız AUTO_INCREMENT, olası maksimum değerinizin yarısı yüksek olacaktır (ve değer aralığının negatif yarısı kullanılmayacaktır).


17
Ancak bunun UNSIGNEDMySQL'e özgü olduğunu ve standart bir SQL özelliği olmadığını unutmayın . Bu, kullanmanın UNSIGNEDgelecekte farklı bir RDBMS'ye geçişi daha karmaşık hale getirebileceği veya SQLAlchemy gibi standart SQL'i hedefleyen yazılım kitaplıklarını kullanırken zorluklara neden olabileceği anlamına gelir . Bunun cevabın bir parçası olması gerektiğini düşünüyorum.
minexew

@ Minexew'in yorumunu Seconding. MySQL veritabanıyla Python'da SQLAlchemy kullanıyorum. Yabancı anahtar kısıtlamaları atanmış sorunlar yaşıyorum çünkü önceden oluşturulmuş tablolarda UNSIGNED tamsayılar var ve SQL standartlarını izleyen SQLAlchemy gibi bir kitaplık, MySQL'e özel kod yazmaya başlamadığınız sürece UNSIGNED sütunları oluşturma seçeneğine sahip değil. Bu, kesinlikle kullanılabilir olmasına rağmen ölçeklenebilir değildir (yani entegrasyon testleri için SQLite veritabanını kullanmak vb.).
MillerMedia


4

Temel olarak UNSIGNED, negatif sayılara ihtiyacınız olmadığını açıkça belirttiğiniz için kendinize tam sayı için iki kat daha fazla yer veriyorsunuz (genellikle sakladığınız değerler asla negatif olmayacağından).


1

Negatif tamsayı değeri için, SIGNEDnegatif olmayan tamsayı değeri UNSIGNEDiçin kullanılır. Her zaman UNSIGNEDbir PRIMARY KEY olarak id için kullanılması önerilir .


1

VIPin cp'ye katılmıyorum .

Doğru, ilk bitin işareti temsil etmek için kullanılmasıdır. Ancak 1 negatif değerler içindir ve 0 pozitif değerler içindir. Negatif değerlerin fazlası farklı bir şekilde kodlanır (ikinin tümleyicisi). TINYINT ile örnek:

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  

0

İ olarak eklemek istiyorum bir şey signed intolan default value in mysql, 1 bittemsil etmek kullanılacaktır sign. -1 for negative and 0 for positive. Dolayısıyla, uygulamanız yalnızca pozitif değer eklerse, işaretsiz belirtmesi daha iyi olur.


0

Saklayacağınız numaraların türünü biliyorsanız, buna göre seçim yapabilirsiniz. Bu durumda asla negatif olamayacak 'id' e sahipsiniz. Yani işaretsiz int kullanabilirsiniz. İşaretli int aralığı: -n / 2 ila + n / 2 İşaretsiz int aralığı: 0 ila n Yani iki kat fazla pozitif sayı elde edersiniz. Buna göre seçin.


0

Sanırım, (Örneğin:) değeri UNSIGNEDgibi bir şeyi dakika veya saat veya saniye biçiminde saklamak için en iyi seçenek olacaktır ki bu kesinlikle negatif olmayan bir sayı olacaktır.time_durationresolved_call_time = resolved_time(DateTime)-creation_time(DateTime)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.