- Konu sahibi
- #1
MySQL UNSIGNED nedir?
MySQL'de
UNSIGNED, bir tamsayı sütununun negatif değer aralığını kullanmamasını ve aynı bit genişliğinde daha büyük pozitif değer aralığı kullanmasını sağlayan özelliktir. Örneğin INT normalde negatif ve pozitif değerleri kapsarken INT UNSIGNED sıfır ve pozitif tamsayıları saklar. Kimlik, sayaç, stok miktarı veya negatif olamayacak başka değerlerde kullanılabilir; ancak değerin hiçbir zaman eksiye düşmeyeceğinden emin değilseniz tercih edilmemelidir.Nasıl çalışır?
Bir tamsayı türü belirli sayıda bit kullanır. İşaretli (
SIGNED) tür bu alanın bir kısmını negatif değerleri göstermek için kullanır. UNSIGNED kullanıldığında negatif değerler kaldırılır ve kullanılabilen aralık pozitif tarafa doğru genişler. UNSIGNED yazılmazsa tamsayı türleri varsayılan olarak işaretlidir.Örnek tablo oluşturma
Aşağıdaki kurgu, deneme veritabanında yeni bir tablo oluşturmak içindir. Aynı adlı gerçek tablonuz varsa komutları üzerine uygulamayın:
- Örnek tabloyu oluşturun:
Kod:CREATE TABLE stock_items ( id INT UNSIGNED NOT NULL AUTO_INCREMENT, product_name VARCHAR(100) NOT NULL, quantity INT UNSIGNED NOT NULL DEFAULT 0, PRIMARY KEY (id) ); - Geçerli kayıt ekleyin:
Kod:INSERT INTO stock_items (product_name, quantity) VALUES ('Kalem', 25); - Sonucu kontrol edin:
Kod:SELECT id, product_name, quantity FROM stock_items; - Sorgu sonucunda
quantitydeğeri25olan kayıt beklenir. Negatif girişte davranış SQL moduna bağlıdır: katı modda aralık dışı değer hata ile reddedilir; kısıtlayıcı modlar kapalıysa değer alt sınır olan sıfıra çekilip uyarıyla saklanabilir.SELECT @@SESSION.sql_mode;ile etkin modu kontrol edin. Bu yüzden yalnızca sütun türüne güvenmeyin, uygulama girişini de doğrulayın.
INT ile INT UNSIGNED arasındaki sınırlar
İki tanım da 4 bayt kullanır. UNSIGNED daha fazla depolama ayırmaz; aynı kapasitenin değer aralığını değiştirir.
| Tanım | En küçük değer | En büyük değer | Depolama |
|---|---|---|---|
| INT | -2147483648 | 2147483647 | 4 bayt |
| INT UNSIGNED | 0 | 4294967295 | 4 bayt |
Hangi durumda kullanılmalı?
- Değerin iş anlamı gereği negatif olamayacağını belirleyin. Ürün adedi, kayıt kimliği ve toplam sayaçlar buna örnektir.
- Uygun kapasiteyi seçin. Küçük bir değer aralığı için
TINYINT,SMALLINT,MEDIUMINT,INTveyaBIGINTarasından ihtiyaca göre seçim yapın; yalnızca sınırı yükseltmek için gereğinden büyük tür kullanmayın. - Tabloyu oluştururken niteliği açıkça belirtin:
Kod:CREATE TABLE orders ( order_id BIGINT UNSIGNED NOT NULL, item_count INT UNSIGNED NOT NULL ); - Mevcut işaretli bir sütunu dönüştürmeden önce negatif veriyi ve yeni türün üst sınırını aşan değerleri araştırın. Örnekteki
stock_items.quantityzaten UNSIGNED olduğundan orada negatif satır aramak geçiş kontrolü sağlamaz. Gerçek eski tabloda verileri iş kuralına göre düzeltin; yedek ve deneme ortamı doğrulaması olmadan şemayı değiştirmeyin. - İlişkili sütunlarda türü eşleştirin. Bir tablodaki
id INT UNSIGNEDsütununa referans veren dış anahtar sütununun da işaret durumu ve temel tür özellikleri uyumlu olmalıdır.
Sık yapılan hatalar ve sınırlamalar
- Her sayısal sütunu
UNSIGNEDyapmak doğru değildir. Bakiye farkı, sıcaklık, koordinat veya eksi değer taşıyabilen başka bir alan için bu nitelik hatalı veri modeline yol açar. - Uygulama tarafından yapılan negatiflik kontrolü tek başına yeterli değildir. Türün aralığı diğer istemciler için de geçerlidir; ancak katı mod kapalıyken kırpılarak saklanan değer iş kuralınızı yine bozabilir.
- Aritmetik işlemlerde sonucun negatif olabileceğini unutmayın. Örneğin bir
UNSIGNEDstoktan daha fazla miktar düşmek, işlem sonucunun tür dönüşümü veya hata nedeniyle beklenmedik davranmasına yol açabilir. Yeterli stok koşulunu eşzamanlı işlemler için de atomik olarak koruyacak bir güncelleme tasarlayın; ayrı bir kontrolün ardından yapılan yazma yarış koşuluna açık olabilir. - İlişkili tabloları sonradan değiştirirken yalnızca görünen tür adına bakmayın.
INTileINT UNSIGNEDaynı tür adı gibi görünse de işaret niteliği farklıdır ve dış anahtar uyumsuzluğu oluşturabilir.
Tür seçerken alanın negatif olması mantıksal olarak imkânsız olduğunu ve seçilen türün üst sınırını değerlendirin. Bu model uygunsa
UNSIGNED kullanın. Değer zaman zaman eksiye düşebiliyorsa işaretli türü koruyup doğrulamayı uygulama veya ayrı bir veritabanı kuralıyla ele alın.Sık sorulan sorular
UNSIGNED bir sütuna NULL yazılabilir mi?
Evet.
UNSIGNED yalnızca negatif sayıları sınırlar; NULL kabul edilip edilmeyeceğini NULL veya NOT NULL tanımı belirler. Alanın mutlaka bir sayı içermesi gerekiyorsa NOT NULL kullanın.UNSIGNED ile AUTO_INCREMENT birlikte kullanılabilir mi?
Evet. Kimlik sütunlarında bu yaygın bir tasarımdır. Yine de sütun türünün kapasitesi, kayıt sayısı arttığında oluşacak en büyük kimliği karşılamalıdır.