2012-07-28 11 views
12

मैंBIGINT अहस्ताक्षरित मूल्य सीमा मेरे एसक्यूएल

# 1690 निम्न त्रुटि हो रही है से बाहर है

यहाँ मेरी क्वेरी

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 

मैंने इसे थोड़ी देर घूर रहा है क्वेरी लंबे मैं माफी चाहता हूँ है।

spawns तालिका - गिनती game_moblist.spawn_id सभी संभव पंक्तियों के लिए 0 लेकिन 1 है (मैं एक पंक्ति हटा दी क्वेरी परीक्षण करने के लिए)

डेटा अन्यथा काफी लंबी और मेरे सवाल का कोई वास्ता नहीं है मुझे लगता है कि

किसी भी विचार इस त्रुटि को कैसे प्राप्त करें?

+0

https://stackoverflow.com/questions/5605085/bigint-unsigned-value-is-out-of-range – qdinar

उत्तर

26

कृपया "Out-of-Range and Overflow Handling" पढ़ें।
इसे कहते हैं:

MySQL 5.5.5 के रूप में, एक त्रुटि में संख्यात्मक अभिव्यक्ति मूल्यांकन परिणाम दौरान अतिप्रवाह। उदाहरण के लिए, सबसे बड़ा हस्ताक्षरित BIGINT मान 9 223372036854775807 है, इसलिए निम्न अभिव्यक्ति एक त्रुटि उत्पन्न करती है।

mysql> SELECT 9223372036854775807 + 1; 

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

, इस मामले में सफल होने के लिए अहस्ताक्षरित के लिए मूल्य परिवर्तित आपरेशन सक्षम करने के लिए;

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

आपकी क्वेरी के हिस्से में बदलाव, जैसा कि निम्नलिखित है, इस मुद्दे को हल करेगा।

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

नहीं तो आप अहस्ताक्षरित कार्यों पर sql_mode बदलने के लिए आवश्यकता हो सकती है।

mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION'; 

और फिर वांछित आउटपुट प्राप्त करने के लिए अपनी क्वेरी चलाएं।

भी देखें एक ऐसी ही पोस्टिंग एक मंच here पर जवाब दे दिया।

+0

लिंक से नोट करने का मुख्य बिंदु यह है कि: पूर्णांक मानों के बीच घटाव, जहां एक UNSIGNED प्रकार का है, डिफ़ॉल्ट रूप से एक हस्ताक्षरित परिणाम उत्पन्न करता है। – arun

2

मुझे वास्तव में यह सवाल मिला कि मैं समाधान क्यों खोज रहा था। यदि आपके पास वही समस्या है जो मैं करता हूं, तो "हस्ताक्षरित" पैरामीटर को अक्षम करने का प्रयास करें।

यह काफी संभव है कि आपके कोड यहाँ विफल रहता है:

(
quantity - COUNT(game_moblist.spawn_id) 
) 

क्योंकि अगर है कि matematic आपरेशन के परिणाम शून्य से कम है यह "अहस्ताक्षरित" पैरामीटर के साथ असफल हो जायेगी।

0

MySQL IF ऑपरेटर का उपयोग करने का अतिरिक्त तरीका है। इससे मुझे मदद मिली जब दोनों कॉलम BIGINT and Unsigned थे।

0

एक अन्य संभावित कारण यह प्रतीत होता है कि परिणाम चर का प्रकार आवंटित किया गया है।

उदाहरण के लिए। '(- markov ((1 /1,045)^tbl_EUR_PDHterm_06) 1।।)'

BIGINT अहस्ताक्षरित मूल्य में सीमा से बाहर है:

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

त्रुटि 1690 (22003) के साथ विफल

जबकि

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

एक उम्मीद होती है क्या करता है (ध्यान दें कि मैं बस की जगह "1" "1.0" से)

फिलिप

2

मैं एक ही समस्या थी, यह एक में शामिल हों पर हुई और यह पता लगाने नहीं कर सकता क्या था चल रहा है, अंत में यह ऑन क्लॉज में टाइपो था जहां मैंने बराबर चिह्न के बजाय एक ऋण चिह्न रखा था। बेवकूफ हो सकता है लेकिन मैंने इसे लगभग 30 मिनट तक नहीं देखा और शायद यह किसी की मदद कर सकता है !!!

+1

हालांकि यह प्रश्न का सीधा जवाब प्रदान नहीं करता है, यह अन्य लोगों की मदद करता है जो एक ही समस्या (जैसे मैंने किया) पर पहुंच सकते हैं। आखिरकार, माइनस साइन बराबर चिह्न के बगल में है! ;) +1 – Sablefoste

0

नियम को सामान्यीकृत करने के लिए, MySQL अब एक हस्ताक्षरित एक से हस्ताक्षर किए गए ऑपरेंड को निकालने से इंकार कर देगा।

उदाहरण: SELECT A - B; विफल हो जाएगा यदि ए हस्ताक्षर किया गया है जबकि बी अनसुलझा है।

वर्कअराउंड: रीट टाइप, या CAST (B AS SIGNED) का उपयोग करें, या यहां तक ​​कि स्वैप (बी - ए) का उपयोग करें और तदनुसार एल्गोरिदम बदलें।

संबंधित मुद्दे