Number overflow. Attempting to store a number with magnitude larger than supported range
TL;DR — Sayınız DynamoDB'nin sınırlarının dışında. N türü, yaklaşık 1E-130 ile 9.9999…E+125 arasında bir büyüklükle 38 basamağa kadar hassasiyet tutar. Bu aralığın ötesindeki bir değer — ya da 38'den fazla anlamlı basamağı olan bir değer — bir istisnayla reddedilir. Büyük ID'leri ve yüksek hassasiyetli değerleri sayı değil, string olarak saklayın.
Ne anlama gelir
ValidationException: 1 validation error detected: Number overflow. Attempting to store a number with magnitude larger than supported rangeDynamoDB'nin Number türü, sınırlı bir aralığa ve 38 anlamlı basamağa sahip bir ondalıktır. Bu ValidationException (HTTP 400), gönderdiğiniz değerin o büyüklüğü aştığı — ya da bir dil çalışma zamanının uzun bir sayısal dizeyi aralığı aşan bir kayan noktalı sayıya dönüştürdüğü anlamına gelir. Bir sayı olarak yeniden denenebilir değildir; değer farklı temsil edilmelidir.
Neden olur
- Gerçekten devasa bir sayı — ~
9.9E+125'ten büyük (ya da büyüklüğü1E-130'dan küçük pozitif) bir değer. - Bir float'a ayrıştırılmış uzun bir sayısal dize — örneğin
Number()/parseFloat()'tan geçirilmiş 120 basamaklı bir hesap/referans numarası8.04e+126gibi bir şey olur ve aralığı aşar. Bu, sık karşılaşılan gerçek dünya tetikleyicisidir. - 38'den fazla anlamlı basamak — DynamoDB'nin Number türü 38 basamağa kadar hassasiyet tutar ve onu aşmak bir istisnayla sonuçlanır.
- Aralığı aşacak kadar büyüyen hesaplanmış bir değer (bir çarpım, bir üs alma).
Nasıl düzeltilir
- Onu sayı değil, string (
S) olarak saklayın. Üzerinde asla matematik yapmadığınız büyük tanımlayıcılar, hesap numaraları ya da hash'ler string olmalıdır — bu, hem büyüklük sınırını hem de 38 basamaklı hassasiyet sınırını atlar. - ID benzeri dizeleri sayılara ayrıştırmayın — 100 basamaklı bir referansı baştan sona string olarak tutun. Onu bir float'a ayrıştırmak, taşmayı üreten şeydir.
- Sayısal öznitelikleri aralık içinde tutun — DynamoDB Number, 38 basamağa kadar hassasiyeti ve ~
9.9E+125'e kadar büyüklüğü destekler. Değerleri sığacak şekilde tasarlayın ya da bölün/ölçeklendirin. - Yüksek hassasiyetli ondalıklar için, sayıları ondalık türünüzden (Python
Decimal, bir big-decimal kitaplığı) dönüştürdüğünüz dizeler olarak iletin, böylece hassasiyet DynamoDB'ye ulaşmadan önce kaybolmasın. - String olarak saklayarak baştaki sıfırları / kesinliği koruyun — Number türü normalleştirir ve zaten baştaki sıfırları koruyamaz.
SSS
DynamoDB'nin sayı sınırları nelerdir? Number türü, 38 basamağa kadar hassasiyeti ve yaklaşık 1E-130 ile 9.9999999999999999999999999999999999999E+125 (pozitif) ve bunların negatiflerini destekler. Bu aralığın dışındaki bir değer "Number overflow." fırlatır.
DynamoDB'de çok büyük bir sayıyı nasıl saklarım? Üzerinde aritmetik yapmıyorsanız onu bir Number (N) yerine bir string (S) özniteliği olarak saklayın — bu, 38 basamaklı hassasiyet sınırını ve büyüklük sınırını tamamen önler. Sıralanabilir sayısal dizeler için, sözcüksel sıra sayısal sırayla eşleşsin diye onları sıfırla doldurun.
İlgili hatalar
- Float types are not supported. Use Decimal types instead — boto3 hassasiyet muadili.
- One or more parameter values were invalid — daha geniş değer doğrulama ailesi.
- Öğrenin: DynamoDB data types · Zero-padding sort keys
Kaynaklar
- Supported data types and naming rules in Amazon DynamoDB — Amazon DynamoDB Developer Guide
- Error handling with DynamoDB — Amazon DynamoDB Developer Guide
- AttributeValue — Amazon DynamoDB API Reference
En son 2026-07-13 tarihinde yukarıda bağlantısı verilen resmi AWS belgelerine karşı doğrulandı.