2010-02-14 5 views
7

मेरे पास एक MySQL डेटाबेस है जो व्यवहार प्रदर्शित कर रहा है मैं बेहतर समझना चाहता हूं। मैं एक आईएनटी फ़ील्ड में डाले गए चार्ज वैल्यू की खोज क्यों कर सकता हूं? मेरे पास एक ऐसा क्षेत्र है जो आईएनटी प्रकार का है लेकिन ऐसा लगता है कि यह चरित्र मूल्यों को रिकॉर्ड करने में सक्षम है, यह कैसे संभव है?आप अक्षरों को एक MySQL int फ़ील्ड में क्यों सम्मिलित कर सकते हैं?

मैंने आईएनटी और वचरर के साथ डेटाबेस बनाकर इस मुद्दे को अलग करने की कोशिश की। मैंने आईएनटी वैल्यू में "टेस्ट 1" डाला लेकिन आईडी स्ट्रिंग वैल्यू का उपयोग कर पंक्ति की तलाश में अभी भी सक्षम था। आईडी मान में स्ट्रिंग डालने के बाद चेतावनी

| Warning | 1366 | Incorrect integer value: 'TEST1' for column 'ID' at row 1 | 

लेकिन मैं अभी भी उस मान को खोजने में सक्षम था। मैं समझना चाहता हूं कि यह क्यों संभव है।

mysql> CREATE TABLE test1(ID int, DATA varchar(255)); 
Query OK, 0 rows affected (0.18 sec) 

mysql> INSERT INTO test1(ID,DATA) VALUES('TEST1', 'TEST1'); 
Query OK, 1 row affected, 1 warning (0.00 sec) 

mysql> SELECT * FROM test1 WHERE ID = 'TEST1'; 
+------+-------+ 
| ID | DATA | 
+------+-------+ 
| 0 | TEST1 | 
+------+-------+ 
1 row in set, 1 warning (0.00 sec) 

चेतावनी चयन करने के बाद

| Warning | 1366 | Incorrect integer value: 'TEST1' for column 'ID' at row 1 | 

है, लेकिन परिणाम अभी भी सही है।

मैं उपरोक्त चयन को 0 परिणाम खोजने की अपेक्षा करता हूं, लेकिन ऐसा नहीं है, क्यों?

उत्तर:

पेका की टिप्पणी जवाब अब स्पष्ट लगता असफ़ के नीचे इस सवाल का जवाब और की मदद से

आईएनएसईआरटी के दौरान, MySQL चरित्र मूल्य को एक आईएनटी फ़ील्ड में सम्मिलित करने में असफल रहा, इसलिए इसे 0 के साथ बदल दिया गया। वही बात चयन के दौरान हुई, इसलिए असल में मैं किसी भी चरित्र मूल्य के लिए आईडी = 0 पर एक चयन कर रहा था। खोज रहा था

mysql> SELECT * FROM test1 WHERE ID = 'SOMETHING_OTHER_THAN_TEST1'; 
+------+-------+ 
| ID | DATA | 
+------+-------+ 
| 0 | TEST1 | 
+------+-------+ 
1 row in set, 1 warning (0.00 sec) 

एक ही परिणाम देता है वह मेरी प्रारंभिक चयन के रूप में के बाद से यह वास्तव में के रूप में

SELECT * FROM test1 WHERE ID = 0; 
बैकएंड में

चल रहा है।

किसी भी मामले में सबसे अच्छा अभ्यास MySQL कॉन्फ़िगरेशन फ़ाइल या SQL कथन में sql_mode = 'STRICT_ALL_TABLES' का उपयोग करना प्रतीत होता है।

एक MySQL सर्वर पर सभी एसक्यूएल प्रश्नों आप अपने my.cnf फ़ाइल जो आम तौर पर /etc/my.cnf

[mysqld] 
... 
... 
... 
sql-mode=STRICT_ALL_TABLES 
+1

आप MySQL जारी '1 warning' आपकी क्वेरी को निष्पादित नोटिस किया .. शायद यह जानना अच्छा है कि यह क्या है ...? – Romain

+0

मैंने चेतावनी के परिणामों के साथ प्रश्न अद्यतन किया, लेकिन परिणाम अभी भी सही है, जो मैं सोच रहा हूं। –

उत्तर

8
में स्थित है में [mysqld] शीर्षक के अंतर्गत निम्नलिखित जोड़ने की जरूरत के लिए STRICT_ALL_TABLES सक्षम करने के लिए

आप STRICT_ALL_TABLES मोड जो my.cnf में या मक्खी पर सेट किया जा सकता की स्थापना द्वारा पहली जगह में डाला जा रहा है से बकवास मूल्यों को रोका जा सकता:

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

mysql> CREATE TABLE test1(ID int, DATA varchar(255)); 
Query OK, 0 rows affected (0.42 sec) 

mysql> INSERT INTO test1(ID,DATA) VALUES('TEST1', 'TEST1'); 
ERROR 1264 (22003): Out of range value adjusted for column 'ID' at row 1 
mysql> SELECT * FROM test1 WHERE ID = 'TEST1'; 
Empty set (0.00 sec) 

mysql> SELECT * FROM test1; 
Empty set (0.00 sec) 
+1

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

+1

+1: यह जानने के लिए बहुत अच्छा :) – Sarfraz

+1

@ माइकल मुझे लगता है कि पहला रूपांतरण (आईडी के लिए) गलत हो गया था, और यह '0' के डिफ़ॉल्ट मान पर वापस आ गया। –

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

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