2008-11-05 13 views
11

मैं PHP से MySQL सामान करने के लिए मानक mysql_connect(), mysql_query(), आदि कथन का उपयोग करता था। हाल ही में मैं अद्भुत एमडीबी 2 कक्षा का उपयोग करने के लिए स्विच कर रहा हूं। इसके साथ में, मैं तैयार बयान का उपयोग कर रहा हूं, इसलिए मुझे अपने इनपुट और एसक्यूएल इंजेक्शन हमलों से बचने की चिंता करने की ज़रूरत नहीं है।MySQL में शून्य-शून्य कॉलम में खाली स्ट्रिंग?

हालांकि, एक समस्या है जिसमें मैं दौड़ रहा हूं। मेरे पास कुछ VARCHAR कॉलम वाली एक तालिका है, जिसे नल के रूप में निर्दिष्ट किया गया है (यानी, नल मानों की अनुमति न दें)। अब

INSERT INTO mytable SET somevarchar = ''; 

, हालांकि, अगर मैं की तरह एक प्रश्न है: का उपयोग करते हुए पुराने MySQL PHP आदेश, मैं बिना किसी समस्या के इस तरह बातें कर सकता है

INSERT INTO mytable SET somevarchar = ?; 

और फिर PHP में मेरे पास है:

$value = ""; 
$prepared = $db->prepare($query, array('text')); 
$result = $prepared->execute($value); 

यह "null value violates not-null constraint"

त्रुटि फेंक होगा एक अस्थायी समाधान के रूप में, मैं ग बिल्ली $value खाली है, और इसे " " (एक ही स्थान) में बदलें, लेकिन यह एक भयानक हैक है और अन्य मुद्दों का कारण बन सकता है।

मैं तैयार बयान के साथ खाली तारों को कैसे सम्मिलित करना चाहता हूं, इसके बजाय इसे एक नल डालने की कोशिश किए बिना?

संपादित करें: यह मेरे पूरे कोडबेस के माध्यम से जाने के लिए एक परियोजना का बहुत बड़ा है, रिक्त स्ट्रिंग का उपयोग करने वाले हर जगह ढूंढें और इसके बजाय न्यूल का उपयोग करने के लिए इसे बदलें। मुझे यह जानने की ज़रूरत है कि क्यों मानक MySQL प्रश्न दो अलग-अलग चीजों के रूप में व्यवहार करते हैं (जैसा कि मुझे लगता है कि सही है), लेकिन तैयार कथन नल में परिवर्तित हो जाते हैं।

ध्यान दें कि "" और न्यूल समान नहीं हैं। उदाहरण के लिए, SELECT NULL = "";1 के बजाय आपको अपेक्षा करता है।

+1

आप "" डालने कर रहे हैं, जो मूल रूप से रिक्त है, तो क्यों में फ़ील्ड को परिवर्तित नहीं डीबी को शून्य की अनुमति देने के लिए। – UnkwnTech

+6

यह "मूल रूप से शून्य" है वैसे ही 0 "मूल रूप से" झूठा है। वे समान हैं लेकिन वास्तव में काफी अलग हैं। – nickf

+1

NULL का अर्थ है "कोई मान नहीं", "खाली स्ट्रिंग" – warren

उत्तर

11

: ऐसा लगता है आप mysqli OO उपयोग कर रहे हैं (टैग और शैली से), लेकिन वाक्य रचना php.net पर manual तुलना में अलग है, बजाय यह करने के लिए कहते हैं जो एमडीबी 2 एपीआई PHP के बतख टाइपिंग अर्थशास्त्र fumbling। चूंकि PHP में खाली स्ट्रिंग न्यूल के समतुल्य है, इसलिए एमडीबी 2 शायद इस तरह गलत तरीके से इलाज कर रहा है। आदर्श समाधान इसके एपीआई के भीतर एक समाधान खोजने के लिए होगा, लेकिन मैं इसके साथ अत्यधिक परिचित नहीं हूं।

एक बात जो आपको विचार करनी चाहिए, यह है कि SQL में एक खाली स्ट्रिंग एक पूर्ण मान नहीं है।हालांकि थोड़ा एक आप से बेहतर

mysql> CREATE TABLE tbl(row CHAR(128) NOT NULL); 
Query OK, 0 rows affected (0.05 sec) 

mysql> INSERT INTO tbl VALUES('not empty'), (''); 
Query OK, 2 rows affected (0.02 sec) 
Records: 2 Duplicates: 0 Warnings: 0 

mysql> SELECT row, row IS NULL FROM tbl; 
+-----------+-------------+ 
| row  | row IS NULL | 
+-----------+-------------+ 
| not empty |   0 | 
|   |   0 | 
+-----------+-------------+ 
2 rows in set (0.00 sec) 

mysql> INSERT INTO tbl VALUES(NULL); 
ERROR 1048 (23000): Column 'row' cannot be null 

आप पा कर पा रहे हैं (या लागू) MDB2 एपीआई में एक समाधान, एक hackish समाधान (: आप उन सम्मिलित कर सकते हैं में पंक्तियों घोषित 'नहीं NULL' ठीक 'वर्तमान में उपयोग कर फिर से) रिक्त स्ट्रिंग के लिए एक user variable परिभाषित करने के लिए हो सकता है - आप एक सम्मिलित बयान में रिक्त स्ट्रिंग का उपयोग लेकिन अपने आप स्ट्रिंग प्रकार के लिए डिफ़ॉल्ट मान करने में असमर्थ खोजने की जरूरत है, तो

SET @EMPTY_STRING = ""; 
UPDATE tbl SET [email protected]_STRING; 

अंत में, MySQL में एक खाली स्ट्रिंग है। तो आप बस INSERT कथन से कॉलम को छोड़ सकते हैं और यह स्वचालित रूप से खाली स्ट्रिंग पर सेट हो जाएगा (बशर्ते कॉलम में कोई पूर्ण बाधा न हो)।

+0

यह था, मुझे नहीं लगता था कि एमडीबी 2 स्वयं अपराधी हो सकता है। धन्यवाद। – davr

0

उद्धरणों का एक खाली सेट नहीं है, "" ऐसा करते हैं?

+0

नहीं, "" और न्यूल अलग-अलग चीजें हैं और अधिकांश डेटाबेस में अलग-अलग व्यवहार करते हैं। – davr

+0

@davr - यही कारण है कि मैंने ऐसा करने के लिए कहा - वह डीबी में कोई वास्तविक मूल्य प्राप्त करने की कोशिश कर रहा है, जो खाली उद्धरण – warren

-1

मैं उलझन में हूं। इस के साथ एक समस्या की तरह लगता है

$query = "INSERT INTO mytable SET somevarchar = ?"; 
$value = ""; 
$prepared = $db->prepare($query); 
$prepared->bind_param("s", $value); 
$result = $prepared->execute(); 
+0

है, मैं एमडीबी 2 का उपयोग कर रहा हूं, जो आंतरिक रूप से mysqli का उपयोग करता है। – davr

17

कुछ उत्तरों के लिए धन्यवाद, मुझे एहसास हुआ कि समस्या एमडीबी 2 एपीआई में हो सकती है, न कि PHP या MYSQL कमांड में। सुनिश्चित करें कि पर्याप्त, मैं MDB2 पूछे जाने वाले प्रश्न में यह पाया:

  • क्यों रिक्त स्ट्रिंग डेटाबेस में शून्य के रूप में खत्म हो? मुझे नल क्यों न्यूल टेक्स्ट फ़ील्ड्स में अनुमति नहीं है, तो डिफ़ॉल्ट मान "" है?
    • समस्या यह है कि कुछ आरडीबीएमएस (सबसे उल्लेखनीय ओरेकल) के लिए एक खाली स्ट्रिंग न्यूल है। इसलिए एमडीबी 2 पर एक पोर्टेबिलिटी विकल्प प्रदान करता है जो सभी RDBMS पर समान व्यवहार को लागू करता है।
    • सभी पोर्टेबिलिटी विकल्प के बाद से डिफ़ॉल्ट रूप से सक्षम कर रहे हैं आप इस सुविधा का अगर तुम न इस व्यवहार करना चाहते हैं निष्क्रिय करने के लिए होगा: $ mdb2-> setOption ('पोर्टेबिलिटी', MDB2_PORTABILITY_ALL^​​ MDB2_PORTABILITY_EMPTY_TO_NULL);

हर किसी के लिए धन्यवाद, जो विचारशील जवाब प्रदान की है।

2

मुझे एहसास है कि इस सवाल का बहुत अधिक उत्तर दिया गया है और सेवानिवृत्त है, लेकिन मुझे इसी तरह की स्थिति के जवाब की तलाश में यह मिला और मैं अंगूठी में अपनी टोपी फेंकने का विरोध नहीं कर सकता।

यह जानने के बिना कि नल/"कॉलम क्या संबंधित है, मुझे नहीं पता कि खाली स्ट्रिंग का वास्तविक महत्व कैसा है। क्या खाली स्ट्रिंग का मतलब कुछ है (जैसे, अगर मैंने किसी न्यायाधीश को मुझे कुछ भी नहीं बदलने के लिए आश्वस्त किया, तो मैं वास्तव में परेशान होगा अगर मेरा नाम मेरे ड्राइवर के लाइसेंस पर न्यूल के रूप में दिखाई देता है। मेरा नाम होगा!

हालांकि, खाली स्ट्रिंग (या रिक्त, या कुछ भी नहीं जो कुछ भी है, न कि किसी भी चीज की कमी (जैसे न्यूल)) का मतलब केवल "नल नहीं" या "कुछ भी नहीं, लेकिन अभी भी नल नहीं है"। आप यहां तक ​​कि दूसरी दिशा में जाएं और सुझाव दें कि मूल्य की अनुपस्थिति न्यूल ने इसे शून्य से कुछ भी कम कर दिया है, कम से कम नल का नाम है जिसे आप जोर से कह सकते हैं!

मेरा मुद्दा यह है कि यदि खाली स्ट्रिंग कुछ डेटा (जैसे नाम, या जो मुझे पसंद है, मेरे फोन नंबर आदि में संख्याओं के बीच डाली जाती है) का प्रत्यक्ष प्रतिनिधित्व है, तो आपके विकल्प या तो बहस करने के लिए हैं आप रिक्त स्ट्रिंग के वैध उपयोग के लिए परेशान हैं या ऐसी किसी चीज का उपयोग करने के लिए जो एक खाली स्ट्रिंग का प्रतिनिधित्व करता है जो नल नहीं है (एक ASCII नियंत्रण चरित्र या कुछ यूनिकोड समकक्ष की तरह, किसी प्रकार का रेगेक्स मान, या इससे भी बदतर, मनमाना अभी तक पूरी तरह से अप्रयुक्त टोकन, जैसे: ◘

यदि खाली सेल वास्तव में केवल शून्य नहीं है, तो आप इसे व्यक्त करने के किसी अन्य तरीके के बारे में सोच सकते हैं। एक मूर्ख और स्पष्ट तरीका वाक्यांश "नल नल" है। लेकिन मेरे पास है एक झुकाव कि NULL का अर्थ है "इस समूह का हिस्सा बिल्कुल नहीं" जबकि खाली स्ट्रिंग का मतलब कुछ है जैसे "यह आदमी शांत है, वह अभी तक अपने गिरोह टैटू नहीं मिला है"। इस स्थिति में मैं इस स्थिति के लिए "डिफ़ॉल्ट" या "रूकी" या "लंबित" जैसे शब्द/नाम/विचार के साथ आउंगा।

अब, अगर कुछ पागल मौके से आप वास्तव में खाली स्ट्रिंग चाहते हैं तो यह प्रतिनिधित्व करने के लिए कि जो न्यूल के योग्य भी नहीं है, फिर से, "-1" या "सुपरनॉल" जैसे किसी और महत्वपूर्ण प्रतीक के साथ आते हैं या "uglies"।

भारतीय जाति व्यवस्था में, सबसे कम जाति शूद्र: किसान और मजदूर हैं। इस जाति के नीचे दलित हैं: "अछूत"। उन्हें निचली जाति नहीं माना जाता है, क्योंकि उन्हें निम्नतम जाति के रूप में स्थापित करने से पूरे सिस्टम का दूषित माना जाएगा।

तो खाली स्ट्रिंग सोचने के लिए मुझे पागल मत कहो नल की तुलना में काम हो सकता है!

'अगली बार टिल।

1

मुझे समाधान मिला!

एमडीबी 2 खाली तारों को नल में परिवर्तित करता है क्योंकि पोर्टेबिलिटी विकल्प MDB2_PORTABILITY_EMPTY_TO_NULL डिफ़ॉल्ट रूप से चालू होता है (ओरेकल के लिए धन्यवाद जो रिक्त स्ट्रिंग को शून्य मानता है)।

स्विच इस विकल्प बंद है जब आप डेटाबेस से कनेक्ट:

$options = array(
    'portability' => MDB2_PORTABILITY_ALL^MDB2_PORTABILITY_EMPTY_TO_NULL 
); 
$res= & MDB2::connect("mysql://user:[email protected]/dbase", $options); 
+0

उहम ... मैंने एक साल पहले इस सटीक उत्तर को लिखा था। – davr

+0

ओह :-) मैंने इसे नोटिस नहीं किया। – ahhon

1

जबकि 0 और रिक्त स्ट्रिंग चर शून्य हैं डेटा का अभाव है। और मुझ पर भरोसा है, यह रिक्त स्ट्रिंग के लिए क्वेरी करने के लिए प्रयास करने के लिए की तुलना में

SELECT * from table where mything IS NULL के लिए एक क्वेरी लिखने के लिए एक बहुत आसान है:/

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