Mehmet

WFN Üye
Konular
1,851
Mesajlar
1,852
Çözüm
0
Ticaret Puanı
0
Üyelik
1 Ay 6 Gün
Konum
YurtDışı
Web Sitesi
Var
Alanı
Google Adsense
1/1
Konu sahibi

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:

  1. Ö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)
    );
  2. Geçerli kayıt ekleyin:
    Kod:
    INSERT INTO stock_items (product_name, quantity)
    VALUES ('Kalem', 25);
  3. Sonucu kontrol edin:
    Kod:
    SELECT id, product_name, quantity
    FROM stock_items;
  4. Sorgu sonucunda quantity değeri 25 olan 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ımEn küçük değerEn büyük değerDepolama
INT-214748364821474836474 bayt
INT UNSIGNED042949672954 bayt

Hangi durumda kullanılmalı?​


  1. Değerin iş anlamı gereği negatif olamayacağını belirleyin. Ürün adedi, kayıt kimliği ve toplam sayaçlar buna örnektir.
  2. Uygun kapasiteyi seçin. Küçük bir değer aralığı için TINYINT, SMALLINT, MEDIUMINT, INT veya BIGINT arası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.
  3. 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
    );
  4. 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.quantity zaten 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.
  5. İlişkili sütunlarda türü eşleştirin. Bir tablodaki id INT UNSIGNED sü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​


  1. Her sayısal sütunu UNSIGNED yapmak 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.
  2. 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.
  3. Aritmetik işlemlerde sonucun negatif olabileceğini unutmayın. Örneğin bir UNSIGNED stoktan 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.
  4. İlişkili tabloları sonradan değiştirirken yalnızca görünen tür adına bakmayın. INT ile INT UNSIGNED aynı 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.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Konuyu görüntüleyenler

Bu konuyu şu anda görüntüleyen üye bulunmuyor.
Robotlar:
  • Anthropic