web-gelistirme-sc.com

BIGINT UNSIGNED DEĞER IS aralık dışı SQL

Aşağıdaki hatayı alıyorum

# 1690 - BIGINT UNSIGNED değeri '(legendsname __.spawnsname __.quantity- tmp_field)' aralığında değil

İşte benim sorgu

SELECT drops.common, drops.uncommon, drops.rare, drops.legendary, spawns . *
     , ( quantity - COUNT( game_moblist.spawn_id ) ) AS quantity_to_spawn
     , mobs . * 
FROM spawns
     LEFT JOIN mobs
          USING ( mob_id ) 
     LEFT JOIN game_moblist
          USING ( spawn_id ) 
     LEFT JOIN drops ON ( 
               SELECT MAX( level ) 
                 FROM drops
                WHERE drops.type = mobs.drop_list
                  AND drops.level <= spawns.level ) 
GROUP BY spawn_id
HAVING quantity_to_spawn >=0
       AND next_spawn <=0

Sorgu uzun süredir ona bakıyorum, üzgünüm.

spawns table - count game_moblist.spawn_id, olası tüm satırlar için 0, ancak 1'dir (sorguyu test etmek için bir satırı sildim)

Aksi takdirde veriler oldukça uzun ve sorumla ilgisiz sanırım

Bu hatanın nasıl giderileceği hakkında bir fikriniz var mı?

12
Shawn

Lütfen " Aralık Dışı ve Taşma İşlemini " okuyun.
Diyor ki:

MySQL 5.5.5'ten itibaren, sayısal ifade değerlendirme sırasındaki taşma hatayla sonuçlanır. Örneğin, imzalanan en büyük BIGINT değeri 9223372036854775807'dir, bu nedenle aşağıdaki ifade bir hata üretir.

mysql> SELECT 9223372036854775807 + 1;

ERROR 1690 (22003): BIGINT value is out of range in '(9223372036854775807 + 1)'

İşlemin bu durumda başarılı olmasını sağlamak için değeri imzasıza dönüştürün;

mysql> SELECT CAST(9223372036854775807 AS UNSIGNED) + 1;
+-------------------------------------------+
| CAST(9223372036854775807 AS UNSIGNED) + 1 |
+-------------------------------------------+
|                       9223372036854775808 |
+-------------------------------------------+

Sorgunuzun bir kısmındaki bir değişiklik, aşağıdaki gibi, sorunu çözecektir.

( CAST( quantity AS SIGNED ) - COUNT( game_moblist.spawn_id ) ) AS quantity_to_spawn

Aksi halde, imzasız işlemlerde sql_mode öğesini değiştirmeniz gerekebilir.

mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';

ve sonra istediğiniz çıktıyı elde etmek için sorgunuzu çalıştırın.

Ayrıca bir forumda cevaplanmış benzer bir gönderiye bakınhere.

27
Ravinder Reddy

Aslında neden çözüm aradığımı bu soruyu buldum. Benimle aynı problemi yaşıyorsanız, "işaretsiz" parametresini devre dışı bırakmayı deneyin.

Kodunuzun burada başarısız olması olasıdır:

(
quantity - COUNT( game_moblist.spawn_id )
)

çünkü bu matematiksel işlemin sonucu sıfırdan az ise "işaretsiz" parametresiyle başarısız olur.

2
Gonzi

Ben de aynı problemi yaşadım, JOIN'de oldu ve neler olduğunu bulamadım, sonunda eşit bir işaret yerine bir eksi işareti koyduğum ON cümlesi yazım hatası oldu. Aptal olabilir ama sadece 30 dakika kadar görmedim ve belki de bu birine yardımcı olabilir !!!

2
zwadder

Ek yol MySQL IF operator kullanmaktır. Her iki sütun da BIGINT and Unsigned olduğunda bu bana yardımcı oldu.

1
Andron

sql_mode MySQL istemcisinde ve Yöneticisinde çalıştı, ancak önemli olduğu CodeIgniter'da çalıştı. Oyuncu seçimi de işe yaramadı.

Basit bir aritmetik işlem hile yaptı:

hata

id - id_ex*1000000000 = id_sm

eserleri

id_sm + id_ex*1000000000 = id
0
kklepper

Başka bir olası neden, sonuç değişkeninin türünün nasıl tahsis edildiği gibi görünmektedir.

Örneğin.

mysql> select (total_balance_06 * 0.045/(1-(1/1.045)^term_06) + unsec_instalments)/income from tbl_EUR_PDH;

ile başarısız

HATA 1690 (22003): BIGINT UNSIGNED değeri '(1 - ((1/1.045) ^ markov.tbl_EUR_PDH.term_06))' aralığında değil

buna karşılık

mysql> select (total_balance_06 * 0.045/(1.0-(1.0/1.045)^term_06) + unsec_instalments)/income from tbl_EUR_PDH;

beklediğiniz şeyi yapar ("1.0" ı sadece "1.0" ile değiştirdiğimi unutmayın)

Philippe

0
Philippe

Ben de benzer bir problem yaşadım, Bu hata aynı zamanda eğer kolonumuzda 0 değer varsa ve onu -1 değerle güncellemeye çalışırsak. Benim durumumda, eğer Mycolum zaten 0 değerine sahipse, MySql Query Failing oldu.

Örneğin

Update table1 set column1=column1-1 where column2=XYZ

Bu hata vermek

BIGINT UNSIGNED değeri .... içindeki aralığın dışında.

Bu sorunu gidermek için

UPDATE table1 SET `column1`=(case when column1 < 1 then 0 else (column1 - 1) end) WHERE column2=1 LIMIT 1
0
Asif Asghar

Kuralı genelleştirmek için, MySQL şimdi bir UNSIGNED işleyicisini bir SİNGİ işaretinden çıkarmayı reddedecektir.

Örnek: eğer A işaretli değilse, B kodunu imzalanmamışsa SELECT A - B; başarısız olur.

Geçici Çözümler: İmzalı işleve 1.0 faktör ekleyin, bu nedenle onu FLOAT'a dolaylı olarak aktarır veya CAST (B AS SIGNED) işlevini kullanır, hatta değiştirir (B - A) ve algoritmayı buna göre değiştirir.

0
Fabien Haddadi