त्रुटि कोड 1292 - गलत किया गया गलत मान - Mysql


85

मुझे यकीन नहीं है कि यह क्या त्रुटि है!

#1292 - Truncated incorrect DOUBLE value: 

मेरे पास डबल वैल्यू फ़ील्ड या डेटा नहीं है!

मैं यह जानने की कोशिश में पूरा एक घंटा बर्बाद कर चुका हूँ!

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

INSERT INTO call_managment_system.contact_numbers 
    (account_id, contact_number, contact_extension, main_number, created_by)
SELECT
    ac.account_id,
    REPLACE(REPLACE(REPLACE(REPLACE(ta.phone_number, '-', ''), ' ', ''), ')', ''),'(','') AS Phone,
    IFNULL(ta.ext, '') AS extention,
    '1' AS MainNumber,
    '2' AS created_by
FROM 
    cvsnumbers AS ta
    INNER JOIN accounts AS ac ON ac.company_code = ta.company_code
WHERE 
    LENGTH(REPLACE(REPLACE(REPLACE(REPLACE(ta.phone_number, '-', ''), ' ', ''), ')', ''),'(','') ) = 10

यहाँ मेरा शो तालिका बनाने के लिए तालिका है जिसके परिणाम सामने आ रहे हैं

CREATE TABLE `contact_numbers` (  
    `number_id` int(10) unsigned NOT NULL AUTO_INCREMENT,  
    `account_id` int(10) unsigned NOT NULL DEFAULT '0',  
    `person_id` int(11) NOT NULL DEFAULT '0',  
    `contact_number` char(15) NOT NULL,  
    `contact_extension` char(10) NOT NULL DEFAULT '',  
    `contact_type` enum('Primary','Direct','Cell','Fax','Home','Reception','Office','TollFree') NOT NULL DEFAULT 'Primary',  
    `contact_link` enum('Account','PDM','Other') NOT NULL DEFAULT 'Account',  
    `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '0 = inactive, 1=active', 
    `main_number` tinyint(1) NOT NULL DEFAULT '0' COMMENT '1 = main phone number',  
    `created_on` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,  
    `created_by` int(11) NOT NULL,  
    `modified_on` datetime DEFAULT NULL,  
    `modified_by` int(11) NOT NULL DEFAULT '0',  
    PRIMARY KEY (`number_id`),  
    KEY `account_id` (`account_id`),  
    KEY `person_id` (`person_id`)
) ENGINE=InnoDB AUTO_INCREMENT=534 DEFAULT CHARSET=utf8

7
इस बग रिपोर्ट के अनुसार संदेश एक स्ट्रिंग कॉलम की पूर्णांक के साथ तुलना करने से आता है, क्योंकि वे दोनों doubleतुलना के लिए परिवर्तित हो जाते हैं । कैसे ac.company_codeऔर ta.company_codeघोषित हैं?
बरमार

Bugs.mysql.com/bug.php?id=46641 भी देखें जहां एक पोस्टर ने सुझाव दिया था कि यह त्रुटि संदेश "जहां संख्यात्मक और गैर-संख्यात्मक स्तंभों के बीच तुलना की अनुमति नहीं है" के लिए
प्रतिरूपित किया जाता है

वे दोनों कॉलम इंट (11) हैं और स्ट्रिंग्स नहीं हैं!
माइक

क्या आप कुछ सैंपल डेटा के साथ एक sqlfield बना सकते हैं?
बरमार

जवाबों:


156

इस संदेश का अर्थ है कि आप एक संख्या और एक स्ट्रिंग WHEREया एक ONखंड में तुलना करने का प्रयास कर रहे हैं । आपकी क्वेरी में, एकमात्र संभावित स्थान जहां यह हो सकता है ON ac.company_code = ta.company_code; या तो सुनिश्चित करें कि उनके पास समान घोषणाएं हैं, या CASTसंख्या को स्ट्रिंग में बदलने के लिए एक स्पष्ट का उपयोग करें ।

यदि आप strictमोड बंद करते हैं, तो त्रुटि चेतावनी में बदल जानी चाहिए।


1
वाह, क्या भ्रामक त्रुटि संदेश है। मदद के लिए धन्यवाद। तुम सही थे। मैं बदलने के लिए जरूरत DB::table('contacts')->where('attendance', $int) ->update(["attendance" => $string]);के लिएDB::table('contacts')->where('attendance', '' . $int) ->update(["attendance" => $string]);
रयान

4
इसके लिए धन्यवाद। विस्तार करने के लिए: इसमें सभी प्रकार के तरीके हैं जिससे इसे ट्रिगर किया जा सकता है। मेरे मामले में, यह एक स्ट्रिंग से पूर्णांक निकालने के लिए एक regexp का उपयोग कर रहा था, और एक पूर्णांक के खिलाफ इसकी तुलना करता है। अजीब तरह से, जब मैंने सिर्फ SELECT स्टेटमेंट का उपयोग किया था, तो यह सब ठीक था: t1.id = substr (मान, पता लगाएं (':', टैगवल्यू) +1) पर t1 इनर ज्वाइन tx से xxxx का चयन करें। एक बार जब मैंने इसे INSERT में बदल दिया। .. सही है, त्रुटि चालू हो गई थी।
xgretsch

22

मैंने इस त्रुटि को ठीक किया क्योंकि क्वेरी में एक सिंटैक्स त्रुटि या कुछ अवांछित वर्ण थे, लेकिन MySQL इसे पकड़ने में सक्षम नहीं था। मैं andअद्यतन के दौरान कई क्षेत्रों के बीच उपयोग कर रहा था , जैसे

update user 
set token='lamblala', 
    accessverion='dummy' and 
    key='somekey' 
where user = 'myself'

उपरोक्त क्वेरी में समस्या का समाधान andअल्पविराम ( ,) के साथ किया जा सकता है


धन्यवाद यह कोई बड़ा मुद्दा नहीं है, लेकिन कभी-कभी छोटी समस्या बड़ा मुद्दा बन जाती है
सुमित कुमार गुप्ता

बहुत बहुत धन्यवाद!!!! यह मेरे लिए एक अपडेट स्टेटमेंट के संदर्भ में हुआ
केसी बाल्ट्ज

8

मैं उसी मुद्दे का सामना कर रहा था। संख्यात्मक 1. के साथ एक varchar (100) कॉलम की तुलना करने की कोशिश करना। 1292 त्रुटि में परिणाम। 1 ('1') के आसपास एकल उद्धरण जोड़कर फिक्स्ड।

ऊपर दिए गए स्पष्टीकरण के लिए धन्यवाद


3

टी एल; डॉ

यह ORस्ट्रिंग कॉलम / शाब्दिक के लिए लागू होने के कारण भी हो सकता है।

पूर्ण संस्करण

मुझे एक सरल INSERTकथन के लिए एक त्रुटि संदेश मिला जिसमें एक दृश्य शामिल है:

insert into t1 select * from v1

हालाँकि सभी स्रोत और लक्ष्य स्तंभ प्रकार के थे VARCHAR। कुछ डिबगिंग के बाद, मुझे मूल कारण मिला; दृश्य में यह टुकड़ा था:

string_col1 OR '_' OR string_col2 OR '_' OR string_col3

जो संभवतः Oracle से निम्नलिखित स्निपेट के स्वचालित रूपांतरण का परिणाम था:

string_col1 || '_' || string_col2 || '_' || string_col3

( ||ओरेकल में स्ट्रिंग कॉन्सेटन है)। समाधान का उपयोग करना था

concat(string_col1, '_', string_col2, '_', string_col3)

बजाय।


धन्यवाद! MySQL के लिए नया, मैं SQL Server अनुमत तरीका, string1 + string2 + string3 जैसे कुछ का उपयोग करके समवर्ती कर रहा था। कॉन्कैट फ़ंक्शन के आपके सुझाव ने मेरे लिए यह त्रुटि निर्धारित की।
मर्सी

1

जब मुझे यह त्रुटि मिली, तो मुझे विश्वास है कि यह एक बग था, हालांकि आपको यह ध्यान रखना चाहिए कि यदि आप एक सेलेक्ट स्टेटमेंट और उसी व्हेयर क्लॉज के साथ एक अलग क्वेरी करते हैं, तो आप उस से प्राइमरी आईडी को सेलेक्ट कर सकते हैं: SELECT CONCAT(primary_id, ',')स्टेटमेंट और इंसर्ट करें उन्हें शर्तों के साथ विफल UPDATE क्वेरी में -> "WHERE [प्रायमरी_आईडी] IN ([सिलेक्ट स्टेटमेंट से अल्पविराम से अलग प्राइमरी आईडी की सूची") जो आपको मूल (फेलियर) क्वेरी के WHERE क्लॉज के कारण होने वाले किसी भी मुद्दे को कम करने की अनुमति देता है।

मेरे लिए, व्यक्तिगत रूप से, जब मैं "WHERE ____ IN ([यहां मूल्य]])" में मानों के लिए उद्धरणों का उपयोग कर रहा था, तो 300 में से केवल 10 अपेक्षित प्रविष्टियां प्रभावित हो रही थीं, जो मेरी राय में, बग की तरह प्रतीत होती हैं।


1

मैंने कुछ ऐसे मामले देखे हैं जहाँ यह त्रुटि होती है:

1. कई मानों की सूची के साथ क्लॉज !=में ऑपरेटर के बराबर नहीं का उपयोग करनाwhereor

जैसे कि:

where columnName !=('A'||'B')

इसका उपयोग करके हल किया जा सकता है

where columnName not in ('A','B')

एक if()समारोह में एक तुलना ऑपरेटर लापता 2 .:

select if(col1,col1,col2);

col1यदि यह मौजूद है तो मान का चयन करने के लिए और अन्यथा मान दिखाने के लिए col2... यह त्रुटि फेंकता है; इसका उपयोग करके हल किया जा सकता है:

select if(col1!='',col1,col2);

0

मेरे मामले में यह एक दृश्य था (अत्यधिक नेस्टेड, दृश्य में देखें) सम्मिलन त्रुटि का कारण बनता है :

CREATE TABLE tablename AS
  SELECT * FROM highly_nested_viewname
;

जो वर्कअराउंड हमने समाप्त किया है, वह एक भौतिक दृष्टिकोण (जो वास्तव में एक तालिका है) का अनुकरण कर रहा था और समय-समय पर संग्रहीत प्रक्रियाओं का उपयोग करके इसे सम्मिलित / अपडेट करता है।


0

पास होने की कोशिश के दौरान ईएस 6 और टाइपफॉर्म के साथ यह मुद्दा था .where("order.id IN (:orders)", { orders }), जहां ordersएक अल्पविराम से अलग स्ट्रिंग की संख्या थी। जब मैं एक टेम्पलेट शाब्दिक में परिवर्तित हुआ, तो समस्या हल हो गई।

.where(`order.id IN (${orders})`);

0

यदि आपने स्ट्रिंग क्षेत्र की लंबाई के लिए मेज पर CHECK CONSTRAINT का उपयोग किया है

उदाहरण के लिए: उपयोगकर्ता नाम की लंबाई> = 8 की जांच करने के लिए

उपयोग:

CHECK (CHAR_LENGTH(username)>=8)

के बजाय

CHECK (username>=8)

अगर किसी की गलत डेटाटाइप तुलना हो तो चेक की कमी को ठीक करें


0

यदि आपके पास डबल मान फ़ील्ड या डेटा नहीं है, तो शायद आपको sql सख्त मोड को अक्षम करने का प्रयास करना चाहिए।

ऐसा करने के लिए आपको MySQL इंस्टॉलेशन फ़ोल्डर में स्थित " my.ini " फाइल को एडिट करना होगा , "SQL मोड को सख्त" लाइन पर सेट करें और नीचे की लाइन बदलें।

# Set the SQL mode to strict
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

इसके लिए, "STRICT_TRANS_TABLES" हटाना

# Set the SQL mode to strict
sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

उसके बाद, आपको इस परिवर्तन को सक्षम करने के लिए MySQL सेवा को पुनरारंभ करना होगा

परिवर्तन की जाँच करने के लिए, संपादक को इस sql वाक्य को निष्पादित करें खोलें:

SHOW VARIABLES LIKE 'sql_mode';

बहुत महत्वपूर्ण : बचत के बाद फ़ाइल प्रारूप से सावधान रहें। इसे "UTF8" के रूप में सहेजें और "BOM के साथ TFT8" के रूप में न करें क्योंकि सेवा पुनरारंभ नहीं होगी।


यह प्रति सत्र के आधार पर करना अधिक सुरक्षित है, या केवल उस विशिष्ट स्क्रिप्ट में भी बेहतर है जो 'परेशान तालिकाओं' को संशोधित कर रही है: $pdo->query('SET SESSION SQL_MODE = "ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"')और आपके स्क्रिप्ट जादू के बाद, उसी तरह से वापस सख्त हो जाएं:$pdo->query('SET SESSION SQL_MODE = "STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"')
पायमोल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.