TL;DR
त्रुटि #1064 का अर्थ है कि MySQL आपके आदेश को नहीं समझ सकता है। इसे ठीक करने के लिए:
-
त्रुटि संदेश पढ़ें। यह आपको बताता है कि बिल्कुल आपके आदेश में कहां है MySQL भ्रमित हो गया।
-
अपने आदेश की जांच करें। यदि आप अपना आदेश बनाने के लिए प्रोग्रामिंग भाषा का उपयोग करते हैं, तो
echo
. का उपयोग करें ,console.log()
, या इसके समकक्ष संपूर्ण कमांड . दिखाने के लिए ताकि आप इसे देख सकें। -
मैनुअल की जांच करें। MySQL उस समय जो अपेक्षित था . से तुलना करके , समस्या अक्सर स्पष्ट होती है।
-
आरक्षित शब्दों की जांच करें। यदि किसी ऑब्जेक्ट पहचानकर्ता पर त्रुटि हुई है, तो जांच लें कि यह एक आरक्षित शब्द नहीं है (और, यदि यह है, तो सुनिश्चित करें कि यह ठीक से उद्धृत किया गया है)।
-
आआघ!! #1064 का क्या मतलब है मतलब ?
त्रुटि संदेश दिख सकते हैं gobbledygook की तरह, लेकिन वे (अक्सर) अविश्वसनीय रूप से जानकारीपूर्ण होते हैं और जो गलत हुआ उसे इंगित करने के लिए पर्याप्त विवरण प्रदान करते हैं। MySQL आपको जो बता रहा है, उसे ठीक से समझकर, आप भविष्य में इस तरह की किसी भी समस्या को ठीक करने के लिए खुद को तैयार कर सकते हैं।
कई कार्यक्रमों की तरह, MySQL त्रुटियों को प्रकार . के अनुसार कोडित किया जाता है हुई समस्या का। त्रुटि #1064 एक सिंटैक्स त्रुटि है।
-
यह "वाक्यविन्यास" क्या है जिसके बारे में आप बोलते हैं? क्या यह जादू टोना है?
जबकि "वाक्यविन्यास" एक ऐसा शब्द है जिसका सामना कई प्रोग्रामर केवल कंप्यूटर के संदर्भ में करते हैं, यह वास्तव में व्यापक भाषाविज्ञान से उधार लिया गया है। यह वाक्य संरचना को संदर्भित करता है:यानी व्याकरण के नियम; या, दूसरे शब्दों में, वे नियम जो परिभाषित करते हैं कि वैध वाक्य . क्या बनता है भाषा के भीतर।
उदाहरण के लिए, निम्न अंग्रेजी वाक्य में एक सिंटैक्स त्रुटि है (क्योंकि अनिश्चित लेख "ए" हमेशा एक संज्ञा से पहले होना चाहिए):
<ब्लॉकक्वॉट>इस वाक्य में सिंटैक्स त्रुटि है a.
-
इसका MySQL से क्या लेना-देना है?
जब भी कोई किसी कंप्यूटर को कमांड जारी करता है, तो उसे सबसे पहले जो काम करना चाहिए, वह है उस कमांड को "पार्स" करना ताकि उसका अर्थ समझ में आ सके। एक "वाक्यविन्यास त्रुटि" का अर्थ है कि पार्सर यह समझने में असमर्थ है कि क्या पूछा जा रहा है क्योंकि यह भाषा के भीतर एक मान्य कमांड का गठन नहीं करता है:दूसरे शब्दों में, कमांड प्रोग्रामिंग भाषा के व्याकरण का उल्लंघन करता है ।
यह नोट करना महत्वपूर्ण है कि कंप्यूटर को इसके साथ कुछ भी करने से पहले कमांड को समझना चाहिए। क्योंकि एक सिंटैक्स त्रुटि है, MySQL को पता नहीं है कि उसके बाद क्या है और इसलिए डेटाबेस को देखने से पहले ही छोड़ देता है और इसलिए स्कीमा या तालिका सामग्री प्रासंगिक नहीं हैं।
-
-
मैं इसे कैसे ठीक करूं?
जाहिर है, किसी को यह निर्धारित करने की आवश्यकता है कि कमांड MySQL के व्याकरण का उल्लंघन कैसे करता है। यह बहुत अभेद्य लग सकता है, लेकिन MySQL यहाँ हमारी मदद करने के लिए वास्तव में कठिन प्रयास कर रहा है। हमें बस इतना करना है...
-
संदेश पढ़ें!
MySQL न केवल हमें बिल्कुल बताता है जहां पार्सर को सिंटैक्स त्रुटि का सामना करना पड़ा, लेकिन इसे ठीक करने के लिए एक सुझाव भी देता है। उदाहरण के लिए, निम्न SQL कमांड पर विचार करें:
UPDATE my_table WHERE id=101 SET name='foo'
वह आदेश निम्न त्रुटि संदेश देता है:
<ब्लॉकक्वॉट>ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE id=101 SET name='foo'' at line 1
पर 'WHERE id=101 SET name='foo'' के पास उपयोग करने के लिए सही सिंटैक्स के लिए आपके MySQL सर्वर संस्करण से संबंधित मैनुअल की जाँच करें।MySQL हमें बता रहा है कि
WHERE
. शब्द तक सब कुछ ठीक लग रहा था , लेकिन फिर एक समस्या का सामना करना पड़ा। दूसरे शब्दों में, यहWHERE
. से मिलने की उम्मीद नहीं कर रहा था उस समय।संदेश जो कहते हैं
...near '' at line...
इसका सीधा सा मतलब है कि कमांड का अंत अप्रत्याशित रूप से हुआ था:यानी, कमांड के समाप्त होने से पहले कुछ और दिखना चाहिए। -
अपने आदेश के वास्तविक पाठ की जांच करें!
प्रोग्रामर अक्सर प्रोग्रामिंग भाषा का उपयोग करके SQL कमांड बनाते हैं। उदाहरण के लिए एक PHP प्रोग्राम में इस तरह की एक (गलत) लाइन हो सकती है:
$result = $mysqli->query("UPDATE " . $tablename ."SET name='foo' WHERE id=101");
अगर आप इसे दो पंक्तियों में लिखते हैं
$query = "UPDATE " . $tablename ."SET name='foo' WHERE id=101" $result = $mysqli->query($query);
तो आप
echo $query;
. जोड़ सकते हैं याvar_dump($query)
यह देखने के लिए कि क्वेरी वास्तव में कहती हैUPDATE userSET name='foo' WHERE id=101
अक्सर आप अपनी त्रुटि तुरंत देखेंगे और इसे ठीक करने में सक्षम होंगे।
-
आदेश का पालन करें!
MySQL यह भी सिफारिश कर रहा है कि हम "उस मैनुअल की जांच करें जो हमारे MySQL संस्करण से मेल खाता है ताकि उपयोग करने के लिए सही सिंटैक्स के लिए ". चलो ऐसा करते हैं।
मैं MySQL v5.6 का उपयोग कर रहा हूं, इसलिए मैं की ओर रुख करूंगा।
UPDATE
. के लिए उस संस्करण की मैन्युअल प्रविष्टि आदेश . पेज पर सबसे पहली चीज कमांड का व्याकरण है (यह हर कमांड के लिए सही है):UPDATE [LOW_PRIORITY] [IGNORE] table_reference SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ... [WHERE where_condition] [ORDER BY ...] [LIMIT row_count]
यह मैनुअल टाइपोग्राफ़िकल और सिंटैक्स कन्वेंशन के तहत इस सिंटैक्स की व्याख्या करने का तरीका बताता है। , लेकिन हमारे उद्देश्यों के लिए यह पहचानना पर्याप्त है कि:वर्ग कोष्ठकों में निहित खंड
[
और]
वैकल्पिक हैं; लंबवत बार|
विकल्प इंगित करें; और दीर्घवृत्त...
या तो संक्षिप्तता के लिए एक चूक को दर्शाता है, या कि पिछले खंड को दोहराया जा सकता है।हम पहले से ही जानते हैं कि पार्सर का मानना था कि
WHERE
. से पहले हमारे आदेश में सब कुछ ठीक था कीवर्ड, या दूसरे शब्दों में तालिका संदर्भ तक और सहित। व्याकरण को देखते हुए, हम देखते हैं किtable_reference
SET
. द्वारा पीछा किया जाना चाहिए कीवर्ड:जबकि हमारे आदेश में यह वास्तव मेंWHERE
. द्वारा पीछा किया गया था खोजशब्द। यह बताता है कि क्यों पार्सर रिपोर्ट करता है कि उस समय एक समस्या का सामना करना पड़ा था।
आरक्षण का एक नोट
बेशक, यह एक साधारण उदाहरण था। हालांकि, ऊपर बताए गए दो चरणों का पालन करके (अर्थात कमांड में ठीक वहीं का अवलोकन करना पार्सर ने पाया कि व्याकरण का उल्लंघन किया गया है और उस समय क्या अपेक्षित था के मैनुअल के विवरण के साथ तुलना कर रहा था ), वस्तुतः हर वाक्य रचना त्रुटि को आसानी से पहचाना जा सकता है।
मैं "वस्तुतः सभी" कहता हूं, क्योंकि समस्याओं का एक छोटा वर्ग है जिसे पहचानना इतना आसान नहीं है- और यही वह जगह है जहां पार्सर का मानना है कि जिस भाषा तत्व का सामना करना पड़ता है उसका मतलब एक चीज है जबकि आप इसका मतलब दूसरे से करना चाहते हैं। निम्नलिखित उदाहरण लें:
UPDATE my_table SET where='foo'
फिर से, पार्सर
<ब्लॉकक्वॉट>WHERE
का सामना करने की अपेक्षा नहीं करता है इस बिंदु पर और इसी तरह एक समान वाक्यविन्यास त्रुटि उत्पन्न करेगा-लेकिन आपने उसwhere
के लिए इरादा नहीं किया था एक SQL कीवर्ड होने के लिए:आपने इसे अपडेट करने के लिए एक कॉलम की पहचान करने का इरादा किया था! हालांकि, जैसा कि स्कीमा ऑब्जेक्ट नेम्स के तहत प्रलेखित है। :यदि किसी पहचानकर्ता में विशेष वर्ण हैं या एक आरक्षित शब्द है, तो आपको जरूरी जब भी आप इसका उल्लेख करें तो इसे उद्धृत करें। (अपवाद:एक आरक्षित शब्द जो एक योग्य नाम में एक अवधि के बाद आता है, एक पहचानकर्ता होना चाहिए, इसलिए इसे उद्धृत करने की आवश्यकता नहीं है।) आरक्षित शब्द अनुभाग 9.3, "कीवर्ड और आरक्षित शब्द" ।
[ deletia ]
पहचानकर्ता उद्धरण वर्ण बैकटिक है ("
`
”):mysql> SELECT * FROM `select` WHERE `select`.id > 100;
अगर
ANSI_QUOTES
SQL मोड सक्षम है, दोहरे उद्धरण चिह्नों के भीतर पहचानकर्ताओं को उद्धृत करने की भी अनुमति है:mysql> CREATE TABLE "test" (col INT); ERROR 1064: You have an error in your SQL syntax... mysql> SET sql_mode='ANSI_QUOTES'; mysql> CREATE TABLE "test" (col INT); Query OK, 0 rows affected (0.00 sec)
-