MySQL में टेक्स्ट कॉलम का डिफ़ॉल्ट मान क्यों नहीं हो सकता है?


184

यदि आप किसी तालिका पर एक पाठ स्तंभ बनाने की कोशिश करते हैं, और इसे MySQL में डिफ़ॉल्ट मान देते हैं, तो आपको एक त्रुटि मिलती है (कम से कम विंडोज पर)। मुझे कोई कारण नहीं दिखाई दे सकता कि टेक्स्ट कॉलम का डिफ़ॉल्ट मान क्यों नहीं होना चाहिए। MySQL प्रलेखन द्वारा कोई स्पष्टीकरण नहीं दिया गया है। यह मेरे लिए अतार्किक लगता है (और कुछ हद तक निराशाजनक है, क्योंकि मैं एक डिफ़ॉल्ट मूल्य चाहता हूं!)। किसी को भी पता है कि इसकी अनुमति क्यों नहीं है?


1
क्या हम आपके द्वारा उपयोग की गई क्वेरी देख सकते हैं?
रॉबर्ट

2
क्या आप सुनिश्चित हैं कि आप एक पाठ स्तंभ चाहते हैं, एक VARCHAR नहीं? TEXT कॉलम उन चीजों के लिए हैं जो 255 बाइट्स से अधिक लंबी हो सकती हैं।
11

5
यह एक टिप्पणी होनी चाहिए। इसके अलावा, हाँ, उसका मतलब है TEXT- उन स्तंभों का डिफ़ॉल्ट मान नहीं हो सकता है। VARCHARकर सकते हैं।
पेकका

1
यदि आप अपने डेटाबेस को सेटअप करने के लिए phpmyadmin का उपयोग कर रहे हैं, तो आप mysql gui tools / जांच करने के लिए चाहते हो सकता है ...)
dmp

1
हां, मुझे दुर्भाग्यवश 255 से अधिक पात्रों की आवश्यकता है।
रस

जवाबों:


92

Windows MySQL v5 एक त्रुटि फेंकता है लेकिन लिनक्स और अन्य संस्करण केवल एक चेतावनी बढ़ाते हैं। इसे ठीक करने की आवश्यकता है। WTF?

इसके अलावा इसे MySQL Bugtracker में बग # 19498 के रूप में ठीक करने का प्रयास देखें:

4 अप्रैल 2008 को 4:36 बजे ब्रायस नेस्बिट:
एमएस विंडोज पर "नो डिफॉल्ट" नियम एक त्रुटि है, जबकि अन्य प्लेटफार्मों पर यह अक्सर एक चेतावनी है। बग नहीं होने पर, यह संभव है कि यदि आप एक लीनियर प्लेटफ़ॉर्म पर कोड लिखते हैं, और बाद में इसे किसी सख्त प्लेटफ़ॉर्म पर चलाते हैं, तो इससे फंस सकते हैं:

व्यक्तिगत रूप से, मैं इसे बग के रूप में देखता हूं। Google पर 2,940 परिणामों के बारे में "BLOB / TEXT कॉलम के लिए खोज करने पर डिफ़ॉल्ट मान नहीं मिल सकता है"। उनमें से ज्यादातर असंगतताओं की रिपोर्ट है जब एक सिस्टम पर काम करने वाले DB स्क्रिप्ट को स्थापित करने की कोशिश की जा रही है, लेकिन अन्य नहीं।

मैं अब उसी समस्या पर चल रहा हूं, एक वेबएप पर मैं अपने एक क्लाइंट के लिए संशोधन कर रहा हूं, जो मूल रूप से लिनक्स MySQL v5.0.83- लॉग पर तैनात है। मैं विंडोज MySQL v5.1.41 चला रहा हूं। यहां तक ​​कि डेटाबेस को निकालने के लिए phpMyAdmin के नवीनतम संस्करण का उपयोग करने की कोशिश कर रहा है, यह प्रश्न में पाठ कॉलम के लिए डिफ़ॉल्ट रिपोर्ट नहीं करता है। फिर भी, जब मैं विंडोज पर एक इन्सर्ट चलाने की कोशिश करता हूं (जो कि लिनक्स परिनियोजन पर ठीक काम करता है) तो मुझे एबीसी कॉलम पर कोई डिफ़ॉल्ट नहीं मिलने की त्रुटि मिलती है। मैं स्पष्ट रूप से डिफ़ॉल्ट के साथ स्थानीय रूप से तालिका को फिर से बनाने की कोशिश करता हूं (उस स्तंभ के लिए अद्वितीय मानों के आधार पर) और अंत में ओह-सो-उपयोगी BLOB / TEXT कॉलम प्राप्त करने का डिफ़ॉल्ट मान नहीं हो सकता है

फिर से, प्लेटफ़ॉर्म पर बुनियादी कॉम्पैटिबिलिटी को बनाए न रखना अस्वीकार्य है और एक बग है।


MySQL 5 (विंडोज) में सख्त मोड को कैसे निष्क्रिय करें:

  • /My.ini संपादित करें और लाइन देखें

    sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
  • इसे बदलें

    sql_mode='MYSQL40'
  • MySQL सेवा को पुनरारंभ करें (यह मानते हुए कि यह mysql5 है)

    net stop mysql5
    net start mysql5

यदि आपके पास रूट / व्यवस्थापक पहुंच है, तो आप निष्पादित करने में सक्षम हो सकते हैं

mysql_query("SET @@global.sql_mode='MYSQL40'");

3
यदि आपकी रूट एक्सेस है और आप phpMyAdmin का उपयोग कर रहे हैं, तो मुख्य पृष्ठ पर जाएं (phpMyAdmin लोगो पर क्लिक करें), वैरिएब टैब पर जाएं, sql_mode वैरिएबल ढूंढें और एडिट पर क्लिक करें।
गाविन

1
मैं एक CentOS 5.8 पर हूँ और MySQL v 14.14 डिस्ट्रीब्यूट 5.1.71 एक TEXT फ़ील्ड के लिए डिफ़ॉल्ट मान सेट करने का प्रयास करते समय चेतावनी के बजाय एक त्रुटि फेंकता है। बस यह नोटिस करना चाहेंगे कि यह हर लिनक्स प्लेटफॉर्म पर काम नहीं कर रहा है।
एलेक्स

ऐसा लगता है कि ओएस एक्स इन दिनों एक त्रुटि फेंक रहा है। डॉक्स dev.mysql.com/doc/refman/5.7/en/blob.html का कहना है कि "BLOB और TEXT कॉलम में DEFAULT मान नहीं हो सकते।"
एफडब्ल्यूआईडब्ल्यू

31

MySQL इंजन के किसी भी गहरे ज्ञान के बिना, मैं कहूंगा कि यह मेमोरी सेविंग स्ट्रैटेजी की तरह लगता है। मुझे लगता है कि कारण डॉक्स से इस पैराग्राफ के पीछे है :

प्रत्येक BLOB या TEXT मान आंतरिक रूप से एक अलग आवंटित वस्तु द्वारा दर्शाया जाता है। यह अन्य सभी डेटा प्रकारों के विपरीत है, जिसके लिए तालिका खोले जाने पर प्रति कॉलम एक बार भंडारण आवंटित किया जाता है।

ऐसा लगता है कि इन कॉलम प्रकारों को पूर्व-भरने से स्मृति उपयोग और प्रदर्शन दंड हो सकता है।


5
-1: डेटा डेटा, जैसे शहर के नाम, एक TEXT कॉलम में वास्तव में CHAR या VARCHAR कॉलम में समान डेटा संग्रहीत करने से कम कुल मेमोरी लेता है।
डेविड कैरी

5
@ मैनुअल अध्याय मैं उद्धृत कर रहा हूँ भंडारण के बारे में नहीं है, लेकिन पुनर्प्राप्ति।
पक्के

1
मैं नहीं देखता कि यह कैसे किसी भी असामान्य स्मृति उपयोग और प्रदर्शन दंड के लिए ले जाएगा। जाहिर है जब कोई उपयोगकर्ता डिफ़ॉल्ट मान को परिभाषित करता है, तो उसे उम्मीद है कि प्रदर्शन में कोई फर्क नहीं पड़ता कि डेटा प्रकार क्या है (विशेषकर बल्क ऑपरेशन पर)। हालाँकि जहाँ तक मैं समझता हूँ कि आप जानते हैं कि BLOB / TEXT क्षेत्र के लिए यह प्रदर्शन हिट अन्य डेटा प्रकारों की तुलना में अपेक्षाकृत अधिक है? और कैसे इस तथ्य से संबंधित है कि BLOB / TEXT आंतरिक रूप से एक अलग वस्तु के रूप में संग्रहीत किया जाता है? इससे मुझे कोई मतलब नहीं है।
अजीब

27
IMHO यह एक मेमोरी सेविंग स्ट्रैटेजी नहीं है। यह या तो बग है या जिन लोगों ने इसे लिखा है वे पागल हैं। और मुझे लगता है कि यह बाद की बात है क्योंकि वे इसे अब कम से कम 8 साल तक ठीक नहीं कर सकते। बुनियादी कार्यक्षमता जो हर दूसरे डेटाबेस में होती है।
अजीब

2
कोई बात नहीं, यह अभी भी उन लोगों के लिए एक विकल्प होना चाहिए जो इसका उपयोग करना चाहते हैं।
jururiks

15

आप ट्रिगर का उपयोग करके डिफ़ॉल्ट मान के समान प्रभाव प्राप्त कर सकते हैं

create table my_text

(
   abc text
);

delimiter //
create trigger mytext_trigger before insert on my_text
for each row
begin
   if (NEW.abc is null ) then
      set NEW.abc = 'default text';
   end if;
end
//
delimiter ;

14

मुख्य प्रश्न के रूप में:

किसी को भी पता है कि इसकी अनुमति क्यों नहीं है?

अभी भी उत्तर नहीं दिया गया है, मैंने त्वरित खोज की और MySQL कीड़े में एक MySQL डेवलपर से अपेक्षाकृत नया अतिरिक्त मिला :

[१ [मार्च २०१ 17 १५:११] स्टेल डेरास

डेवलपर द्वारा पोस्ट:

यह वास्तव में एक मान्य सुविधा अनुरोध है, और पहली नज़र में यह जोड़ने के लिए मामूली लग सकता है। लेकिन TEXT / BLOBS मानों को पढ़ने / अपडेट करने वाली तालिकाओं के लिए उपयोग किए जाने वाले रिकॉर्ड बफर में सीधे संग्रहीत नहीं किया जाता है। इसलिए उनके लिए डिफ़ॉल्ट मान निर्दिष्ट करना थोड़ा अधिक जटिल है।

यह कोई निश्चित जवाब नहीं है, लेकिन कम से कम क्यों सवाल के लिए एक प्रारंभिक बिंदु ।

इस समय के दौरान, मैं बस इसके चारों ओर कोड करूंगा और या तो कॉलम को अशक्त कर दूंगा या एप्लिकेशन कोड से ''प्रत्येक के लिए स्पष्ट रूप से (डिफ़ॉल्ट ) मान असाइन करूंगा insert...


13

"TEXT / BLOB कॉलम में DEFAULT के लिए समर्थन" MySQL Bugtracker (बग # 21532) में एक सुविधा अनुरोध है

मैं देख रहा हूँ कि मैं केवल एक ही व्यक्ति नहीं हूँ जो TEXT कॉलम में डिफ़ॉल्ट मान रखना चाहता है। मुझे लगता है कि यह सुविधा MySQL के बाद के संस्करण में समर्थित होनी चाहिए।

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


मुझे लगता है कि आपको इसे "" और NULL के बीच बदलने में सक्षम होना चाहिए एक TEXT कॉलम जो अशक्त करने की अनुमति देता है। ऐसा करना संभव नहीं लगता।
phpguru

6

मैं आमतौर पर लिनक्स पर साइटें चलाता हूं, लेकिन मैं स्थानीय विंडोज मशीन पर भी विकसित करता हूं। मैंने कई बार इस समस्या में भाग लिया है और जब मैंने समस्याओं का सामना किया तो बस तालिकाओं को ठीक किया। मैंने कल किसी व्यक्ति की मदद करने के लिए एक ऐप स्थापित किया और निश्चित रूप से फिर से समस्या में भाग गया। इसलिए, मैंने फैसला किया कि यह पता लगाने का समय था कि क्या चल रहा था - और इस धागे को पाया। मुझे वास्तव में सर्वर के sql_mode को पहले मोड (डिफ़ॉल्ट रूप से) में बदलने का विचार पसंद नहीं है, इसलिए मैं एक सरल (मुझे लगता है) समाधान के साथ आया था।

यह समाधान निश्चित रूप से डेवलपर्स को विंडोज पर चलने वाले MySQL मुद्दे की भरपाई के लिए अपनी टेबल निर्माण स्क्रिप्ट को लपेटने की आवश्यकता होगी। आपको डंप फ़ाइलों में समान अवधारणाएँ दिखाई देंगी। एक बड़ा चेतावनी यह है कि यदि विभाजन का उपयोग किया जाता है तो यह समस्या उत्पन्न कर सकता है।

// Store the current sql_mode
mysql_query("set @orig_mode = @@global.sql_mode");

// Set sql_mode to one that won't trigger errors...
mysql_query('set @@global.sql_mode = "MYSQL40"');

/**
 * Do table creations here...
 */

// Change it back to original sql_mode
mysql_query('set @@global.sql_mode = @orig_mode');

यह इसके बारे में।


1
यह इस सवाल को संबोधित नहीं करता है कि MySQL के पास व्यवहार क्यों है, लेकिन अपने दृष्टिकोण को साझा करने के लिए धन्यवाद ताकि दूसरों को भी लाभ हो सके। ढेर अतिप्रवाह में आपका स्वागत है!
गार्गुनच्यूट सेप

1
हां मुझे पता है ... मुझे यह देखने के लिए आगे STRICT मोड में देखना होगा कि क्या यह समझ में आता है - चूंकि MySQL निक्स के बॉक्स पर चेतावनी फेंकता है, लेकिन विंडोज बॉक्स पर विफल रहता है। यह एक संकेत है कि प्लेटफॉर्म की परवाह किए बिना कार्यान्वयन में कुछ गड़बड़ हो सकती है। आप देखेंगे कि MySQL के दस्तावेज़ में यह सूचना है: "BLOB और TEXT कॉलम में DEFAULT मान नहीं हो सकते।" इसलिए तार्किक रूप से, ऐसा प्रतीत होता है कि 5 से पहले के संस्करणों में कार्यान्वयन वास्तव में सभी प्लेटफार्मों पर टूट गया था।
डेरेल ग्रीनहाउस

3

उबंटू के लिए 16.04:

MySQL 5.7 में सख्त मोड को निष्क्रिय कैसे करें:

फ़ाइल /etc/mysql/mysql.conf.d/mysqld.cnf संपादित करें

यदि नीचे लाइन mysql.cnf में मौजूद है

sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

फिर से बदलें

sql_mode='MYSQL40'

अन्यथा

बस mysqld.cnf में नीचे पंक्ति जोड़ें

sql_mode='MYSQL40'

इससे समस्या का समाधान हो गया।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.