ত্রুটি কোড 1292 - ছাঁটাই করা ভুল ডবল মান - মাইএসকিএল


87

আমি নিশ্চিত নই যে এই ত্রুটিটি কী!

#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

8
মতে এই বাগ রিপোর্ট বার্তা, একটি পূর্ণসংখ্যা সঙ্গে একটি স্ট্রিং কলামের তুলনা কারণ তারা উভয় পেতে রূপান্তরিত থেকে আসে doubleতুলনা জন্য। কেমন আছেন ac.company_codeএবং ta.company_codeঘোষনা পাঠ করলেন?
বর্মার

এছাড়াও bugs.mysql.com/bug.php?id=46641 দেখুন যেখানে কোনও পোস্টার সুপারিশ করেছিল যে এই ত্রুটি বার্তাটি "সংখ্যাসূচক এবং অ-সংখ্যাযুক্ত কলামগুলির মধ্যে কোথায় তুলনা করার অনুমতি নেই"
অনুবাদ করা হয়েছে

এই দুটি কলামই ইন্টার (11) এবং স্ট্রিং নয়!
মাইক 22

আপনি কি কিছু নমুনা ডেটা দিয়ে একটি স্ক্লফিল্ড তৈরি করতে পারেন?
বর্মার

উত্তর:


159

এই বার্তাটি আপনি একটি নম্বর এবং একটি একটি স্ট্রিং তুলনা করার চেষ্টা করছেন মানে WHEREবা ONদফা। আপনার ক্যোয়ারিতে, একমাত্র সম্ভাব্য জায়গা যেখানে এটি ঘটতে পারে ON ac.company_code = ta.company_code; হয় তা নিশ্চিত করুন যে তাদের অনুরূপ ঘোষণা রয়েছে, বা CASTসংখ্যাটিকে স্ট্রিংয়ে রূপান্তর করতে একটি স্পষ্ট ব্যবহার করুন ।

আপনি যদি strictমোডটি অফ করেন , ত্রুটিটি একটি সতর্কতার মধ্যে পরিণত হবে।


4
বাহ, কী বিভ্রান্তিকর ত্রুটি বার্তা। সাহায্য করার জন্যে ধন্যবাদ. আপনি ঠিক বলেছেন। আমি পরিবর্তন করা প্রয়োজন DB::table('contacts')->where('attendance', $int) ->update(["attendance" => $string]);থেকেDB::table('contacts')->where('attendance', '' . $int) ->update(["attendance" => $string]);
রায়ান

4
এর জন্য ধন্যবাদ. প্রসারিত করার জন্য: সমস্ত ধরণের উপায় রয়েছে যাতে এটি ট্রিগার হতে পারে। আমার ক্ষেত্রে এটি স্ট্রিং থেকে পূর্ণসংখ্যা বের করতে একটি রেজিএক্সপ্যাক ব্যবহার করে এবং এটি একটি পূর্ণসংখ্যার সাথে তুলনা করে। অদ্ভুতভাবে, যখন আমি কেবল নির্বাচন বাছাইটি ব্যবহার করেছি, এটি সমস্ত ঠিক ছিল: t1.id = সাবস্ট্রিতে টি 1 অন্তর্গত টিএন থেকে এক্সএক্সএক্সএক্সএক্স নির্বাচন করুন (মান, সন্ধান করুন (':', ট্যাগভ্যালু) +1) একবার আমি এটিকে INSERT এ পরিণত করেছি। ..সে, ত্রুটি ট্রিগার হয়েছিল।
xgretsch

22

সিন্ট্যাক্স ত্রুটি বা ক্যোয়ারীতে কিছু অযাচিত অক্ষর থাকায় আমি এই ত্রুটিটি সংশোধন করেছি, তবে মাইএসকিউএল এটি ধরতে সক্ষম হয় নি। andআপডেটের সময় আমি একাধিক ক্ষেত্রের মধ্যে ব্যবহার করছিলাম , যেমন

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

উপরোক্ত ক্যোয়ারিতে সমস্যাটি andকমা ( ,) দিয়ে প্রতিস্থাপনের মাধ্যমে সমাধান করা যেতে পারে


ধন্যবাদ এটি কোনও বড় সমস্যা নয় তবে কিছু সময় ছোট সমস্যা হয়ে ওঠে বড় সমস্যা
সুমিত কুমার গুপ্ত

তোমাকে অনেক ধন্যবাদ!!!! একটি আপডেট বিবৃতি প্রসঙ্গে আমার সাথে এটি ঘটেছিল
কেসি বাল্টজ

8

আমি একই সমস্যা ছিল। সংখ্যার সাথে একটি বারচার (100) কলামটি তুলনা করার চেষ্টা করা হচ্ছে 1292 ত্রুটির প্রতিক্রিয়াযুক্ত। 1 ('1') এর আশেপাশে একক উদ্ধৃতি যুক্ত করে স্থির করা হয়েছে।

উপরের ব্যাখ্যার জন্য ধন্যবাদ


3

টিএল; ডাঃ

ORস্ট্রিং কলাম / আক্ষরিক প্রয়োগের ফলেও এটি হতে পারে ।

পূর্ণ সংস্করণ

আমি INSERTএকটি ভিউ জড়িত একটি সাধারণ বিবৃতি জন্য একই ত্রুটি বার্তা পেয়েছি :

insert into t1 select * from v1

যদিও সমস্ত উত্স এবং লক্ষ্য কলামগুলি টাইপের ছিল VARCHAR। কিছু ডিবাগিংয়ের পরে, আমি এর মূল কারণটি খুঁজে পেয়েছি; দর্শনটিতে এই খণ্ডটি রয়েছে:

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

যা সম্ভবতঃ ওরাকল থেকে নিম্নলিখিত স্নিপেটের একটি স্বয়ংক্রিয় রূপান্তরনের ফলাফল ছিল:

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

( ||ওরাকলে স্ট্রিং কনটেক্সটেশন)। সমাধানটি ব্যবহার করা ছিল

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

পরিবর্তে.


ধন্যবাদ! মাইএসকিউএল-এ নতুন, আমি এসকিউএল সার্ভারের অনুমতিপ্রাপ্ত উপায়টি ব্যবহার করেছি, স্ট্রিং 1 + স্ট্রিং 2 + স্ট্রিং 3 এর মতো কিছু। কনক্যাট ফাংশনের আপনার পরামর্শটি আমার জন্য এই ত্রুটিটি স্থির করে।
মারসি 13

1

যখন আমি এই ত্রুটিটি পেয়েছি তখন আমি বিশ্বাস করি এটি একটি ত্রুটি ছিল, তবে আপনার মনে রাখা উচিত যে আপনি যদি একটি নির্বাচনী বিবৃতি এবং একই WHERE ধারা সহ পৃথক ক্যোয়ারী করেন তবে আপনি সেই নির্বাচন SELECT CONCAT(primary_id, ','):) বিবৃতিটি থেকে প্রাথমিক আইডিটি ধরে ফেলতে পারেন এবং সন্নিবেশ করতে পারেন এগুলি শর্তাদি সহ ব্যর্থ আপডেটের প্রশ্নের সাথে -> "যেখানে [প্রাথমিক_আইডি] ইন ([নির্বাচিত বিবৃতি থেকে কমা-বিচ্ছিন্ন প্রাথমিক আইডির তালিকা))" যা আপনাকে মূল (ব্যর্থ) কোয়েরির দফায় দায়েরের কারণে যে কোনও সমস্যা হ্রাস করতে দেয়।

আমার জন্য, ব্যক্তিগতভাবে, যখন আমি "WHERE ____ IN ([এখানে মানগুলি])" এর মানগুলির জন্য উদ্ধৃতিগুলি ব্যবহার করছিলাম, তখন 300 প্রত্যাশিত এন্ট্রিগুলির মধ্যে কেবল 10 টিই প্রভাবিত হচ্ছিল যা আমার মতে, এটি একটি বাগের মতো মনে হচ্ছে।


1

আমি বেশ কয়েকটি ক্ষেত্রে দেখেছি যেখানে এই ত্রুটি দেখা দেয়:

1. ব্যবহার করছেন না অপারেটর সমান !=একটি whereদফা একাধিক একটি তালিকা সঙ্গে orমান

যেমন:

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

এটি ব্যবহার করে সমাধান করা যেতে পারে

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

২. একটি if()ফাংশনে তুলনা অপারেটর মিস করছি :

select if(col1,col1,col2);

যাতে মান col1বিদ্যমান থাকে তা নির্বাচন করতে এবং অন্যথায় মানটি প্রদর্শন করতে col2... এটি ত্রুটিটিকে ছুঁড়ে ফেলে; এটি ব্যবহার করে সমাধান করা যেতে পারে:

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

0

আমার ক্ষেত্রে এটি একটি ভিউ (অত্যন্ত নেস্টেড, ভিউতে দেখুন) সন্নিবেশ ত্রুটির কারণ হয়েছিল :

CREATE TABLE tablename AS
  SELECT * FROM highly_nested_viewname
;

আমরা যে পরিশ্রমটি শেষ করেছিলাম তা হ'ল একটি বস্তুগত দর্শন (যা আসলেই একটি টেবিল) সিমুলেট করে এবং স্টোরেজ পদ্ধতি ব্যবহার করে পর্যায়ক্রমে এটি সন্নিবেশ / আপডেট করে।


0

পাস করার চেষ্টা করার সময় ES6 এবং টাইপঅর্মের সাথে এই সমস্যাটি ছিল .where("order.id IN (:orders)", { orders }), যেখানে ordersসংখ্যার কমা দ্বারা পৃথক করা স্ট্রিং ছিল। আমি যখন কোনও টেমপ্লেটকে আক্ষরিক রূপান্তরিত করি তখন সমস্যাটি সমাধান হয়ে যায়।

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

0

আপনি যদি স্ট্রিং ফিল্ডের দৈর্ঘ্যের জন্য টেবিলে চেক কনট্রন্ট ব্যবহার করেন

যেমন: ব্যবহারকারীর দৈর্ঘ্য> = 8 পরীক্ষা করতে

ব্যবহার:

CHECK (CHAR_LENGTH(username)>=8)

পরিবর্তে

CHECK (username>=8)

যদি কোনওর সাথে ভুল ডেটাটাইপ তুলনা থাকে তবে চেক সীমাবদ্ধতাটি ঠিক করুন


0

আপনার যদি দ্বিগুণ মান ক্ষেত্র বা ডেটা না থাকে তবে আপনার স্কেল কঠোর মোড অক্ষম করার চেষ্টা করা উচিত।

এটি করতে আপনাকে মাইএসকিউএল ইনস্টলেশন ফোল্ডারে অবস্থিত " my.ini " ফাইলটি সম্পাদনা করতে হবে , "এসকিউএল মোডটি কঠোরভাবে সেট করুন" সন্ধান করুন এবং নীচের লাইনটি পরিবর্তন করুন:

# 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"

এর পরে, আপনাকে এই পরিবর্তনটি সক্ষম করতে মাইএসকিউএল পরিষেবাটি পুনরায় চালু করতে হবে।

পরিবর্তনটি পরীক্ষা করতে, সম্পাদককে এই বর্গ বাক্যটি কার্যকর করুন:

SHOW VARIABLES LIKE 'sql_mode';

খুব গুরুত্বপূর্ণ : সংরক্ষণের পরে ফাইল ফর্ম্যাটটি সম্পর্কে সতর্ক থাকুন। এটিকে "ইউটিএফ 8" হিসাবে সংরক্ষণ করুন এবং "বিওএম সহ টিএফটি 8" হিসাবে ব্যবহার করবেন না কারণ পরিষেবাটি আরম্ভ হবে না।


প্রতি সেশনের ভিত্তিতে এটি করা আরও নিরাপদ, বা নির্দিষ্ট $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"')
সমস্যাটিতে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.