2009-11-09 13 views
22

पर कॉलम 'कॉलम_नाम' के लिए डेटा को छोटा कर दिया गया है, मैं एक PHP/MySQL एप्लिकेशन बना रहा हूं और मैं अपने निर्माण और अद्यतन क्वेरी के साथ एक समस्या में भाग रहा हूं। मेरे पास 5 कॉलम हैं जो टाइप करने के लिए सेट हैं फ्लोट जो नल कॉलम के रूप में भी सेट हैं। मैं उन्हें वर्कफ़्लो में बाद में भरने की योजना नहीं बना रहा हूं।यह त्रुटि क्या है? "डेटाबेस क्वेरी विफल: पंक्ति 1

हालांकि, मुझे इस डेटाबेस के लिए नए रिकॉर्ड बनाने की आवश्यकता है, और मुझे मौजूदा रिकॉर्ड को संपादित करने की आवश्यकता है इन 5 फ्लोट फ़ील्ड को स्पर्श करना। मैं ओओपी PHP का उपयोग कर रहा हूं जो एक मानक save() विधि का उपयोग करता है जो यह देखने के लिए जांचता है कि ऑब्जेक्ट में कोई आईडी मौजूद है या नहीं। यदि नहीं, तो यह create() पर कॉल करता है, और यदि ऐसा है, तो यह बहुत काम करता है अच्छा, आमतौर पर

update() और create() विधियों को प्रत्येक कक्षा के शीर्ष पर घोषित protected static $db_fields विशेषता सरणी से खींचने के लिए डिज़ाइन किया गया है, जिसमें उस तालिका में उपयोग किए गए सभी फ़ील्ड शामिल हैं। update() और create() उस सरणी के माध्यम से चलाया गया है और या तो INSERT INTO या UPDATE एसक्यूएल में है।

मेरी समझ यह है कि यदि आप '' (दो एकल उद्धरण, खाली) का उपयोग करते हैं, तो SQL उन INSERT INTO या UPDATE अनुरोधों को छोड़ देगा और उन्हें न्यूल के रूप में छोड़ देगा। पृष्ठ पर कहीं भी उन 5 फ्लोट मानों के लिए फॉर्म फ़ील्ड भी नहीं हैं, इसलिए निश्चित रूप से जब विधियां चलती हैं, तो मान '' होने जा रहे हैं।

क्या मुझे "डेटा कटा हुआ" त्रुटि मिल रही है? यह अलग दिखता है - मैंने पहले छंटनी हुई त्रुटि नहीं देखी है और यही कारण है कि मैं आपके प्रतिभाशाली हूं। धन्यवाद।

+0

मेरा झुकाव यह है कि MySQL अपेक्षा करता है कि कम से कम संख्यात्मक या न्यूल होने के लिए मूल्यों को फ़्लोट फ़ील्ड में लिखा जा रहा है। क्या आपने '' के बजाय न्यूल का उपयोग करने की कोशिश की है? – jkndrkn

उत्तर

29

'' और null समान नहीं हैं। यदि आपका mysql सर्वर सख्त मोड में है, तो यह कॉलम के लिए अमान्य डेटा पारित करने के बाद से सम्मिलित करने से इंकार कर देगा। सख्त मोड के बिना, यह एक चेतावनी देता है।

mysql> create table a (a float not null); 
Query OK, 0 rows affected (0.11 sec) 

mysql> insert a values (''); 
Query OK, 1 row affected, 1 warning (0.05 sec) 

mysql> show warnings; 
+---------+------+----------------------------------------+ 
| Level | Code | Message        | 
+---------+------+----------------------------------------+ 
| Warning | 1265 | Data truncated for column 'a' at row 1 | 
+---------+------+----------------------------------------+ 
1 row in set (0.00 sec) 

mysql> set sql_mode = 'STRICT_ALL_TABLES'; 
Query OK, 0 rows affected (0.02 sec) 

mysql> insert a values (''); 
ERROR 1265 (01000): Data truncated for column 'a' at row 1 

या तो स्पष्ट null रों डालें, या यहाँ तक कि डालने में स्तंभ निर्दिष्ट नहीं करते।

जब आप अपडेट कर रहे हैं तो आप अपने सभी मूल्य भेज सकते हैं क्योंकि mysql स्वचालित रूप से अपरिवर्तित लोगों को अनदेखा कर देगा।

+0

हाँ, मैं देख सकता हूं कि मुझे ऐसा करने की ज़रूरत है। लेकिन अद्यतन के साथ यह वास्तव में सच नहीं हो सकता है, क्योंकि आपके पास अक्सर एक ऐसा फॉर्म होता है जिसमें सभी रिकॉर्ड के कॉलम होते हैं लेकिन आप केवल एक या दो अपडेट करते हैं, और एप्लिकेशन नहीं जानता कि कौन से बदले गए थे, इसलिए यह उन सभी को अपडेट करता है, आदि। मुझे क्या रूचि है - यह कहां से चल रही त्रुटि है? – rhodesjason

+0

मेरा अद्यतन उदाहरण देखें। truncate त्रुटि mysql आपको बता रही है कि यह शून्य-लंबाई वाली स्ट्रिंग को परिवर्तित नहीं कर सका जिसे आपने इसे उचित संख्यात्मक मान में पारित किया था। – longneck

+0

ठीक है, मुझे यह जानने की ज़रूरत है - यह केवल सम्मिलित होने के दौरान एक समस्या है और अद्यतन के दौरान नहीं। मैं चिंतित हो रहा था! धन्यवाद। – rhodesjason

1

यदि आप डेटा को INSERT नहीं जा रहे हैं तो यह SQL कथन में नहीं होना चाहिए।

उदाहरण के तौर पर, कहें कि आपके पास आईडी, फ्लोट 1, फ्लोट 2, फ्लोट 3, और फ्लोट 4, फ्लोट 5 के साथ एक टेबल "डेटा" है, जिसमें से आप केवल आईडी जोड़ रहे होंगे। सम्मिलित करें इस तरह दिखना चाहिए:

INSERT INTO `Data` (`id`) 
VALUES ('Some-ID-Value') 

तैरता NULL वे NULL सामान्य रूप से हो जाएगा स्वीकार करने के लिए परिभाषित कर रहे हैं। अपडेट स्टेटमेंट्स के लिए यह वही है, आपको केवल उन फ़ील्ड को सूचीबद्ध करना चाहिए जिन्हें आप बदल देंगे।

1

यह समाधान के रूप में नहीं है, लेकिन केवल समस्या पर कुछ और प्रकाश डालने के लिए।

यदि आप कथन में कीवर्ड IGNORE जोड़ते हैं, और एक फ्लोट कॉलम में '' (या किसी भी स्ट्रिंग से शुरू नहीं हो) डालने का प्रयास करें, तो MySQL डिफ़ॉल्ट मान के बजाय मान 0 डालेंगे।

INSERT IGNORE INTO a_table (float_column) VALUE ('') 

INSERT IGNORE INTO a_table (float_column) VALUE ('abc') 

दोनों 0 से जोड़ दिया जाएगा, डिफ़ॉल्ट रिक्त है, भले ही। IGNORE के बिना, ज़ाहिर है, दोनों कथन आप जो त्रुटि देख रहे हैं उसे बढ़ाएंगे।

संक्षेप में, आपको संदेश मिलता है क्योंकि आप जिस डेटा को आपूर्ति कर रहे हैं वह न तो अपेक्षित प्रकार और न ही डिफ़ॉल्ट मान है।

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