কেন কোনও পাঠ্য কলামের মাইএসকিউএল-তে একটি ডিফল্ট মান থাকতে পারে না?


184

আপনি যদি কোনও টেবিলে একটি টেক্সট কলাম তৈরি করার চেষ্টা করেন এবং এটি মাইএসকিউএলকে একটি ডিফল্ট মান দেন তবে আপনি একটি ত্রুটি পান (কমপক্ষে উইন্ডোজে)। কোনও পাঠ্য কলামের ডিফল্ট মান না থাকার কোনও কারণ আমি দেখতে পাচ্ছি না। মাইএসকিউএল ডকুমেন্টেশন দ্বারা কোনও ব্যাখ্যা দেওয়া হয়নি। এটি আমার কাছে অযৌক্তিক বলে মনে হচ্ছে (এবং কিছুটা হতাশার কারণ আমিও ডিফল্ট মান চাই!)। কেউ জানেন কেন এটি অনুমোদিত নয়?


1
আপনার ব্যবহৃত ক্যোয়ারী আমরা কী দেখতে পাব?
রবার্ট

2
আপনি কি নিশ্চিত যে আপনি কোনও টেক্সট কলাম চান, একটি ভিআরচারার নয়? পাঠ্য কলামগুলি এমন জিনিসের জন্য যা 255 বাইটের বেশি দীর্ঘ হতে পারে।
scy

5
এটি একটি মন্তব্য করা উচিত। এছাড়াও, হ্যাঁ, তার অর্থ হল TEXT- এই কলামগুলির একটি ডিফল্ট মান থাকতে পারে না। VARCHARকরতে পারা.
পেক্কা

1
আপনি যদি আপনার ডেটাবেস সেটআপ করতে phpmyadmin ব্যবহার করেন তবে মাইএসকিএল গুঁই সরঞ্জামগুলি / ওয়ার্কবেঞ্চ ...;) তদন্ত করতে চাইতে পারেন
dmp

1
হ্যাঁ, আমার দুর্ভাগ্যক্রমে 255 টিরও বেশি অক্ষর প্রয়োজন।
রাশ

উত্তর:


92

উইন্ডোজ মাইএসকিউএল ভি 5 ত্রুটি ছুঁড়েছে তবে লিনাক্স এবং অন্যান্য সংস্করণগুলি কেবল একটি সতর্কতা উত্থাপন করে। এই সমস্যা সংশোধন করা হবে। ডব্লিউটিএফ?

এটিকে মাইএসকিউএল বগট্রেকারে # 19498 বাগ হিসাবে ঠিক করার চেষ্টাও দেখুন:

ব্রাইস নেসবিট 4 এপ্রিল ২০০৮ 4:36 অপরাহ্ন:
এমএস উইন্ডোজটিতে "নো ডিফল্ট" বিধি একটি ত্রুটি, অন্য প্ল্যাটফর্মে এটি প্রায়শই একটি সতর্কতা হিসাবে কাজ করে। কোনও বাগ নেই, আপনি যদি কোনও প্রচ্ছন্ন প্ল্যাটফর্মে কোড লিখে থাকেন এবং পরে এটি একটি কঠোর প্ল্যাটফর্মে চালান তবে এটির দ্বারা আটকা পড়ে যাওয়া সম্ভব:

ব্যক্তিগতভাবে, আমি এটিকে বাগ হিসাবে দেখি। "বিএলওবি / টেক্সট কলামের জন্য অনুসন্ধানের কোনও ডিফল্ট মান থাকতে পারে না" গুগলে প্রায় 2,940 ফলাফল দেয়। একটি সিস্টেমে কাজ করে তবে অন্যদের নয়, ডিবি স্ক্রিপ্টগুলি ইনস্টল করার চেষ্টা করার সময় তাদের বেশিরভাগই অসঙ্গতিগুলির প্রতিবেদন।

মূলত লিনাক্স মাইএসকিউএল v5.0.83-লগতে মোতায়েন করা আমার ক্লায়েন্টগুলির জন্য আমি একটি ওয়েব অ্যাপে আমি সংশোধন করছি এমন একটি ওয়েবপ্যাটে আমি এখন একই সমস্যাটিতে চলেছি। আমি উইন্ডোজ মাইএসকিউএল v5.1.41 চালাচ্ছি। এমনকি পিএইচপিএমআইএডমিনের সর্বশেষতম সংস্করণটি ডাটাবেসটি বের করার জন্য ব্যবহার করার চেষ্টা করা হলেও এটি প্রশ্নযুক্ত পাঠ্য কলামের জন্য কোনও ডিফল্ট হিসাবে রিপোর্ট করে না। তবুও, যখন আমি উইন্ডোজে একটি সন্নিবেশ চালানোর চেষ্টা করি (এটি লিনাক্স স্থাপনার ক্ষেত্রে ভাল কাজ করে) তখন আমি এবিসি কলামে কোনও ডিফল্ট ত্রুটি পাই না receive আমি স্পষ্টতই ডিফল্ট (column কলামটির অনন্য মানের একটি নির্বাচনের উপর ভিত্তি করে) স্থানীয়ভাবে টেবিলটি পুনরায় তৈরি করার চেষ্টা করি এবং শেষ পর্যন্ত ওহ-তাই-দরকারী BLOB / পাঠ্য কলামটি পেতে একটি ডিফল্ট মান থাকতে পারে না

আবার, প্ল্যাটফর্ম জুড়ে বেসিক সামঞ্জস্যতা বজায় রাখা অগ্রহণযোগ্য এবং এটি একটি বাগ।


মাইএসকিউএল 5 (উইন্ডোজ) এ কিভাবে কঠোর মোড অক্ষম করবেন:

  • সম্পাদনা /my.ini এবং লাইন জন্য সন্ধান করুন

    sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
  • এটি দিয়ে প্রতিস্থাপন করুন

    sql_mode='MYSQL40'
  • মাইএসকিউএল পরিষেবাটি পুনঃসূচনা করুন (ধরে নিবেন যে এটি মাইএসকিএল 5)

    net stop mysql5
    net start mysql5

আপনার যদি রুট / অ্যাডমিন অ্যাক্সেস থাকে তবে আপনি কার্যকর করতে সক্ষম হতে পারেন

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

3
আপনার যদি রুট অ্যাক্সেস থাকে এবং phpMyAdmin ব্যবহার করে থাকেন তবে মূল পৃষ্ঠায় যান (পিএইচপিএমআইএডমিন লোগোটি ক্লিক করুন), ভেরিয়েবল ট্যাবে যান, sql_mode ভেরিয়েবলটি সন্ধান করুন এবং সম্পাদনা ক্লিক করুন।
গাভিন

1
আমি একটি সেন্টোস 5.8 এ আছি এবং মাইএসকিউএল বনাম 14.14 ডিস্ট্রিবিউ 5.1.71 যখন কোনও টেক্সট ক্ষেত্রে ডিফল্ট মান সেট করার চেষ্টা করার সময় সতর্কতার পরিবর্তে একটি ত্রুটি ছুড়ে দেয়। এটি লক্ষ্য করতে চাই যে এটি প্রতিটি লিনাক্স প্ল্যাটফর্মে কাজ করছে না।
অ্যালেক্স

নাহলে ওএস এক্স আজকাল কোনও ত্রুটি ফেলেছে বলে মনে হচ্ছে। Dev.mysql.com/doc/refman/5.7/en/blob.html দস্তাবেজগুলি বলছে "BLOB এবং পাঠ্য কলামগুলির মান মান থাকতে পারে না।" এফডব্লিউআইডাব্লু (তবে কেন নয়)
রজারডপ্যাক

31

মাইএসকিউএল ইঞ্জিনের কোনও গভীর জ্ঞান ছাড়াই, আমি এটিকে মেমরি সঞ্চয় কৌশল হিসাবে বলব। আমি অনুমান করি ডক্স থেকে এই অনুচ্ছেদের পিছনে কারণ রয়েছে :

প্রতিটি বিএলওবি বা টেক্সট মান পৃথক বরাদ্দকৃত বস্তুর মাধ্যমে অভ্যন্তরীণভাবে উপস্থাপিত হয়। এটি অন্যান্য সমস্ত ডেটা ধরণের বিপরীতে, যার জন্য টেবিলটি খোলার সময় প্রতি কলামে স্টোরেজ বরাদ্দ করা হয়।

দেখে মনে হচ্ছে এই কলামগুলির প্রি-ফিলিং মেমরির ব্যবহার এবং পারফরম্যান্স জরিমানার দিকে নিয়ে যাবে।


5
-১: কোনও পাঠ্য কলামে নগরের নামগুলির মতো ডেটা সংরক্ষণ করা আসলে কোনও চার্চ বা ভোরচার কলামে একই ডেটা সঞ্চয় করার চেয়ে কম মোট স্মৃতি নেয়।
ডেভিড ক্যারি

5
@ ডেভিড যে ম্যানুয়াল অধ্যায়টি আমি উদ্ধৃত করছি তা স্টোরেজ সম্পর্কিত নয়, তবে পুনরুদ্ধারের।
পেক্কা

1
আমি দেখতে পাচ্ছি না কীভাবে এটি কোনও অস্বাভাবিক মেমরির ব্যবহার এবং পারফরম্যান্সের জরিমানার দিকে নিয়ে যায়। স্পষ্টতই যখন কোনও ব্যবহারকারী কোনও ডিফল্ট মান নির্ধারণ করে তখন তিনি কোনও প্রকারের পারফরম্যান্সের প্রত্যাশা করেন যা তথ্যের ধরণটি (বিশেষত বাল্ক অপারেশনগুলিতে) যাই হোক না কেন hit তবে যতদূর আমি বুঝতে পেরেছি যে একটি ব্লগ / টেক্সট ফিল্ডের জন্য এই পারফরম্যান্স হিট অন্যান্য ডেটা ধরণের তুলনায় তুলনামূলকভাবে বেশি? এবং বিএলওবি / টেক্সট কোনও পৃথক বস্তু হিসাবে অভ্যন্তরীণভাবে সংরক্ষণ করা হয় এর সাথে কীভাবে সম্পর্কিত? এটি আমার কোনও অর্থবোধ করে না।
freakish

27
আইএমএইচও এটি কোনও মেমরি সঞ্চয় কৌশল নয়। এটি হয় একটি বাগ বা যারা এটি লিখেছিল তারা পাগল। এবং আমি মনে করি এটি পরবর্তী কারণ তারা এখন কমপক্ষে 8 বছরের জন্য এটি ঠিক করতে পারে না। প্রতিটি অন্যান্য ডাটাবেসটিতে রয়েছে মৌলিক কার্যকারিতা।
21:25

2
কিছু যায় আসে না, এটি এখনও যারা এটি ব্যবহার করতে চান তাদের জন্য এটি একটি বিকল্প হওয়া উচিত।
jurchiks 23'15

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

মূল প্রশ্ন হিসাবে:

কেউ জানেন কেন এটি অনুমোদিত নয়?

এখনও উত্তর দেওয়া হয়নি, আমি একটি দ্রুত অনুসন্ধান করেছি এবং মাইএসকিউএল বাগগুলিতে মাইএসকিউএল বিকাশকারী থেকে অপেক্ষাকৃত নতুন সংযোজন পেয়েছি :

[17 মার্চ 2017 15:11] স্টেল ডেরাস

বিকাশকারী পোস্ট করেছেন:

এটি সত্যই একটি বৈধ বৈশিষ্ট্য অনুরোধ, এবং প্রথম নজরে এটি যুক্ত করা তুচ্ছ মনে হতে পারে। কিন্তু পাঠ / ব্লবস মানগুলি টেবিলগুলি পড়ার / আপডেট করার জন্য ব্যবহৃত রেকর্ড বাফারে সরাসরি সংরক্ষণ করা হয় না। সুতরাং তাদের জন্য ডিফল্ট মান নির্ধারণ করা কিছুটা জটিল।

এটি কোনও সুনির্দিষ্ট উত্তর নয়, তবে কমপক্ষে কেন প্রশ্নটির একটি সূচনা পয়েন্ট ।

মাঝামাঝি সময়ে, আমি কেবল এটির চারপাশে কোড করব এবং হয় কলামটি বাতিলযোগ্য করব বা স্পষ্টভাবে অ্যাপ্লিকেশন কোড থেকে ''প্রতিটিটির জন্য একটি (ডিফল্ট ) মান নির্ধারণ করব insert...


13

"টেক্সট / বিএলএবিও কলামগুলিতে ডিফল্টের জন্য সমর্থন" মাইএসকিউএল বাগট্রেকার (বাগ # 21532) এর একটি বৈশিষ্ট্য অনুরোধ

আমি দেখতে পাচ্ছি যে আমিই একমাত্র টেক্সট কলামে একটি ডিফল্ট মান রাখতে চাই না। আমি মনে করি এই বৈশিষ্ট্যটি মাইএসকিউএলের পরবর্তী সংস্করণে সমর্থন করা উচিত।

এটি মাইএসকিউএল এর 5.0 সংস্করণে ঠিক করা যায় না, কারণ স্পষ্টতই যদি কেউ সেই বৈশিষ্ট্যটি সমর্থন করে না এমন (বর্তমান) ডাটাবেসগুলির মধ্যে কোনও ডাটাবেসকে সামনে এবং পিছনে স্থানান্তরিত করার চেষ্টা করে তবে এটি অসঙ্গতি এবং ডেটালাসের কারণ হতে পারে বৈশিষ্ট্য।


আমার কাছে মনে হচ্ছে আপনার পাঠ্য কলামের জন্য "" এবং NULL এর মধ্যে এটি পরিবর্তন করতে সক্ষম হওয়া উচিত যা শূন্য করে। এটা করা সম্ভব বলে মনে হচ্ছে না।
পিএইচপিগুরু

6

আমি সাধারণত লিনাক্সে সাইট চালাই তবে স্থানীয় উইন্ডোজ মেশিনেও বিকাশ করি। আমি অনেকবার এই সমস্যায় পড়েছি এবং যখন সমস্যার মুখোমুখি হই তখন কেবল সারণীগুলি স্থির করেছি। কাউকে সাহায্য করার জন্য আমি গতকাল একটি অ্যাপ্লিকেশন ইনস্টল করেছি এবং অবশ্যই আবার সমস্যার মধ্যে পড়ে। সুতরাং, আমি স্থির করেছি যে এখন কী চলছে তা বের করার সময় - এবং এই থ্রেডটি খুঁজে পেয়েছি। আমি সার্ভারের স্ক্যালি_মোডটি পূর্ববর্তী মোডে (ডিফল্টরূপে) পরিবর্তনের ধারণাটি পছন্দ করি না, তাই আমি একটি সহজ (আমার ধারণা) সমাধান নিয়ে এসেছি।

এই সমাধানটি অবশ্যই বিকাশকারীদের উইন্ডোতে চলমান মাইএসকিউএল সমস্যাটির জন্য ক্ষতিপূরণ দেওয়ার জন্য তাদের টেবিল তৈরি স্ক্রিপ্টগুলি মোড়ানো প্রয়োজন। আপনি ডাম্প ফাইলগুলিতে অনুরূপ ধারণাগুলি দেখতে পাবেন। একটি বিআইজি ক্যাভিয়েট হ'ল পার্টিশনটি ব্যবহার করা হলে এটি সমস্যা সৃষ্টি করতে পারে / করবে।

// 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
এটি মাইএসকিউএল এর আচরণ কেন একেবারেই হয় তার প্রশ্নের সমাধান করে না, তবে আপনার পদ্ধতির ভাগ করে নেওয়ার জন্য ধন্যবাদ যাতে অন্যরাও উপকৃত হতে পারে। স্ট্যাক ওভারফ্লোতে স্বাগতম!
গারগান্টুচেট

1
ইয়া আমি জানি ... আমার আর স্ট্রাইক মোডে তা দেখতে হবে কিনা তা বোঝার দরকার আছে - যেহেতু মাইএসকিউএল নিক্সের বাক্সগুলিতে একটি সতর্কতা ফেলেছে, তবে উইন্ডোজ বাক্সগুলিতে ব্যর্থ হয়। এটি এমন একটি ইঙ্গিত যা প্ল্যাটফর্ম নির্বিশেষে বাস্তবায়নে কিছু ভুল হতে পারে। আপনি লক্ষ্য করবেন যে মাইএসকিউএল এর ডকুমেন্টেশনে, এই নোটিশটি রয়েছে: "ব্লগ এবং পাঠ্য কলামগুলিতে মানগুলি থাকতে পারে না।" সুতরাং যৌক্তিকভাবে, এটি প্রদর্শিত হয় যে 5 এর পূর্বে সংস্করণগুলিতে বাস্তবায়ন আসলে সমস্ত প্ল্যাটফর্মগুলিতে ভেঙে গেছে।
ড্যারেল গ্রিনহাউস

3

উবুন্টু 16.04 এর জন্য:

মাইএসকিউএল ৫. in-তে কীভাবে কঠোর মোড অক্ষম করবেন:

ফাইল /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'

এই সমস্যার সমাধান।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.