mysql - DATE বা DATETIME এর জন্য ডিফল্ট মান সেট করার সময় মাইএসকিএলে ত্রুটি




console (8)

সিন্ট্যাক্স সমস্যা কনফিগার করুন

* নিক্স সিস্টেমের অধীনে এমওয়াইএসকিউএল এর কয়েকটি সংস্করণে (পরীক্ষিত 5.7। *) আপনার এই সিনট্যাক্সটি ব্যবহার করা উচিত:

[mysqld]

sql-mode="NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLE,NO_ENGINE_SUBSTITUTION"

এগুলি কাজ করবে না:

কোন উদ্ধৃতি ড্যাশ

sql-mode=NO_ENGINE_SUBSTITUTION

কোন উদ্ধৃতি আন্ডারস্কোর

sql_mode=NO_ENGINE_SUBSTITUTION

আন্ডারস্কোর এবং কোট

sql_mode="NO_ENGINE_SUBSTITUTION"

কনফিগার মান এবং স্কেল-মোডের আরও সম্পূর্ণ পর্যালোচনা:

স্থায়ী স্কেল মোড পতাকা কীভাবে সেটআপ করবেন

আমি মাইএসকিএল সার্ভার 5.7.11 এবং এই বাক্যটি চালাচ্ছি:

updated datetime NOT NULL DEFAULT '0000-00-00 00:00:00'

কাজ করছে না । ত্রুটি দেওয়া:

ERROR 1067 (42000): Invalid default value for 'updated'

তবে নিম্নলিখিত:

updated datetime NOT NULL DEFAULT '1000-01-01 00:00:00'

শুধু কাজ করে

তারিখের জন্য একই ক্ষেত্রে।

সাইডেনোট হিসাবে এটি মাইএসকিএল ডক্সে উল্লেখ করা হয়েছে:

তারিখের অংশ সহ মানগুলির জন্য DATE প্রকারটি ব্যবহৃত হয় তবে সময় অংশ হয় না। মাইএসকিউএল 'YYYY-MM-DD' ফর্ম্যাটে তারিখের মানগুলি উদ্ধার করে এবং প্রদর্শন করে। সমর্থিত পরিসরটি '1000-01-01' থেকে '9999-12-31' পর্যন্ত।

এমনকি যদি তারা বলে:

অবৈধ তারিখ, DATETIME, বা TIMESTAMP মানগুলি উপযুক্ত ধরণের ('0000-00-00' বা '0000-00-00 00:00:00') এর "শূন্য" মান রূপান্তরিত হয়।

মাইএসকিএল ডকুমেন্টেশন থেকে দ্বিতীয় উক্তিটিও অ্যাকাউন্টে রেখে, কেউ আমাকে জানতে পারে কেন এটি ত্রুটি দিচ্ছে?


আমার এই ত্রুটিটি ডাব্লুএএমএপি 3.0.0 এর সাথে মাইএসকিএল 5.7.14 এর সাথে ছিল।

সমাধান :

c:\wamp\bin\mysql\mysql5.7.14\my.ini ফাইলটিতে 70 লাইন পরিবর্তন করুন (যদি আপনার c:\wamp\bin\mysql\mysql5.7.14\my.ini ফাইলটি আনা থাকে না)

sql-mode= "STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_AUTO_CREATE_USER"

থেকে

sql-mode="ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_AUTO_CREATE_USER"

এবং সমস্ত পরিষেবা পুনরায় চালু করুন।

এটি কঠোর মোড অক্ষম করবে। ডকুমেন্টেশন অনুসারে, "কঠোর মোড" এর অর্থ একটি বা দুটি বা STRICT_ALL_TABLES STRICT_TRANS_TABLES বা STRICT_ALL_TABLES সক্ষম STRICT_TRANS_TABLES মোড। documentation বলছে:

"মাইএসকিউএল ৫. in-এ ডিফল্ট এসকিউএল মোডে এই মোডগুলি অন্তর্ভুক্ত রয়েছে: কেবলমাত্র_ফুল_আরগ্রুপ_বাই, স্ট্রিকT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USERIN, এবং N89_"


এই উত্তরটি কেবল মাইএসকিউএল 5.7 এর জন্য:

সেরাটি আসলে শূন্য স্কেল_মোডে সেট করা হয় না, পরিবর্তে পিএইচপি-র সাথে একটি সেশন ভেরিয়েবল ব্যবহার করুন:

SET SESSION sql_mode= 'ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'

অন্তত আপনি অন্য ডিফল্ট মান রাখুন।

এটি ক্রেজি যে মাইএসকিএল ডকুমেন্টেশন পরিষ্কার নয়, আপনার এই ডিফল্ট মানগুলি sql_mode এ মুছতে হবে:

NO_ZERO_IN_DATE, NO_ZERO_DATE, আমি বুঝতে পারি, তবে ভবিষ্যতের সংস্করণগুলিতে এটি বন্ধ হয়ে যাবে।

এর সাথে STRICT_ALL_TABLES, পরামিতিগুলি অগ্রাহ্য করার আগে, সুতরাং আপনার এটিও মুছতে হবে।

অবশেষে ট্র্যাডিশনালও, তবে ডকুমেন্টেশন এই পরামিতি সম্পর্কে বলে: "কলামে একটি ভুল মান সন্নিবেশ করানোর সময়" একটি সতর্কতার পরিবর্তে একটি ত্রুটি দিন ", এই প্যারামিটারের সাথে শূন্য মান সহ তারিখগুলি sertedোকানো হয় না, তবে হ্যাঁ না করে।

মাইএসকিউএল এই প্যারামিটার এবং সংমিশ্রণগুলির সাথে সত্যই সংগঠিত নয়।


এটি 5.7.8 এর জন্য কাজ করে:

mysql> create table t1(updated datetime NOT NULL DEFAULT '0000-00-00 00:00:00');
Query OK, 0 rows affected (0.01 sec)

mysql> show create table t1;
+-------+-------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                            |
+-------+-------------------------------------------------------------------------------------------------------------------------+
| t1    | CREATE TABLE `t1` (
  `updated` datetime NOT NULL DEFAULT '0000-00-00 00:00:00'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
+-------+-------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> select version();
+-----------+
| version() |
+-----------+
| 5.7.8-rc  |
+-----------+
1 row in set (0.00 sec)

আপনার সমস্যাটি পুনরায় তৈরি করতে আপনি একটি এসকিউএলফিডাল তৈরি করতে পারেন।

http://sqlfiddle.com/

যদি এটি মাইএসকিউএল 5.6 এবং 5.7.8 এর জন্য কাজ করে তবে 5.7.11 এ ব্যর্থ হয়। তারপরে এটি সম্ভবত 5.7.11 এর জন্য একটি রিগ্রেশন বাগ হতে পারে।


ত্রুটিটি স্কেল মোডের কারণে যা সর্বশেষতম MYSQL 5.7 ডকুমেন্টেশন অনুসারে কঠোর মোড হতে পারে

মাইএসকিউএল ডকুমেন্টেশন 5.7 বলেছেন :

সার্ভারটি '0000-00-00' কে বৈধ তারিখ হিসাবে অনুমতি দেয় কিনা তা কঠোর মোডে প্রভাবিত করে: কঠোর মোড সক্ষম না করা থাকলে, '0000-00-00' অনুমোদিত এবং সন্নিবেশকারীরা কোনও সতর্কবাণী তৈরি করে না। যদি কঠোর মোড সক্ষম করা থাকে তবে '0000-00-00' অনুমোদিত নয় এবং আইজিএনওর না দেওয়া থাকলে সন্নিবেশগুলি একটি ত্রুটি তৈরি করে। ইনসার্ট ইগনোর এবং আপডেট ইগনোরের জন্য, '0000-00-00' অনুমোদিত এবং সন্নিবেশকারীরা একটি সতর্কতা উত্পন্ন করে।

MYSQL মোডটি পরীক্ষা করতে Check

SELECT @@GLOBAL.sql_mode global, @@SESSION.sql_mode session

STRICT_TRANS_TABLES মোড অক্ষম করা হচ্ছে

তবে 0000-00-00 00:00:00 ফর্ম্যাটটি অনুমোদনের জন্য আপনাকে মাইএসকিএল কনফিগারেশনের ফাইলে বা কমান্ডের সাহায্যে স্ট্রিকT_TRANS_TABLES মোড অক্ষম করতে হবে

আদেশে

SET sql_mode = '';

অথবা

SET GLOBAL sql_mode = '';

GLOBAL কীওয়ার্ডটি ব্যবহারের জন্য সুপার প্রিলিবিজগুলি প্রয়োজন এবং এটি সমস্ত ক্লায়েন্টরা সেই সময় থেকে সংযুক্ত অপারেশনগুলিকে প্রভাবিত করে

যদি উপরে /etc/mysql/my.cnf যান (উবুন্টু অনুসারে) গিয়ে কাজ না করে থাকেন এবং /etc/mysql/my.cnf মন্তব্য করুন

এছাড়াও, আপনি যদি সার্ভার স্টার্টআপে স্থায়ীভাবে SET sql_mode='' মোড সেট করতে চান তবে লিনাক্স বা SET sql_mode='' তে SET sql_mode='' অন্তর্ভুক্ত করুন। উইন্ডোজের জন্য এটি my.ini ফাইলে করতে হবে।

বিঃদ্রঃ

তবে এমআইএসকিউএল 5.6-এ ডিফল্টরূপে কঠোর মোড সক্ষম করা নেই। সুতরাং এটি এমওয়াইএসকিউএল 6 ডকুমেন্টেশন অনুযায়ী ত্রুটি তৈরি করে না যা বলে

মাইএসকিউএল আপনাকে "ডামি তারিখ" হিসাবে '0000-00-00' এর একটি "শূন্য" মান সংরক্ষণ করার অনুমতি দেয়। এটি NUL মানগুলি ব্যবহার করার চেয়ে কিছু ক্ষেত্রে বেশি সুবিধাজনক এবং ডেটা এবং সূচী স্থানটি কম ব্যবহার করে। '0000-00-00' বাতিল করতে, NO_ZERO_DATE এসকিউএল মোড সক্ষম করুন।

হালনাগাদ

@ ডিলান-সু-এর কথায় বাগ সংক্রান্ত বিষয়ে:

আমি মনে করি না যে এটি সময়ের সাথে সাথে এমওয়াইএসকিউএলটি বিকশিত হয়েছিল যার ফলে পণ্যের আরও উন্নতির উপর ভিত্তি করে কিছু জিনিস পরিবর্তন করা হয়েছে।

তবে NOW() ফাংশন সম্পর্কিত আমার সাথে সম্পর্কিত আরও একটি বাগ রিপোর্ট রয়েছে

ডেটটাইম ফিল্ড এখন ডিফল্ট গ্রহণ করে না ()

আর একটি দরকারী নোট [দেখুন TIMESTAMP এবং DATETIME এর জন্য স্বয়ংক্রিয় সূচনা এবং আপডেট করা ]

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

NO_ZERO_DATE সম্পর্কিত আপডেট

মাইএসকিউএল হিসাবে 7.7.৪ হিসাবে এই মোডটি অবচিত করা হয়েছে। পূর্ববর্তী সংস্করণের জন্য আপনাকে অবশ্যই কনফিগার ফাইলে সম্পর্কিত লাইনটি মন্তব্য করতে হবে। NO_ZERO_DATE এ মাইএসকিউএল 5.7 নথিভুক্ত করুন


প্রথমে বর্তমান অধিবেশন নির্বাচন করুন sql_mode :

SELECT @@SESSION.sql_mode;

তারপরে আপনি সেই ডিফল্ট মানটির মতো কিছু পাবেন:

'ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION'

এবং তারপরে 'NO_ZERO_DATE' ছাড়াই sql_mode সেট করুন:

SET SESSION sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

আপনার যদি অনুদান থাকে তবে আপনি এটি বিশ্বব্যাপীও করতে পারেন:

SELECT @@GLOBAL.sql_mode;
SET GLOBAL sql_mode = '...';

mysql Ver 14.14 Distrib 5.7.18, for Linux (x86_64) জন্য বিকল্প সংমিশ্রণ mysql Ver 14.14 Distrib 5.7.18, for Linux (x86_64)

ছুঁড়ে না:

STRICT_TRANS_TABLES + NO_ZERO_DATE

ছোঁড়ার:

STRICT_TRANS_TABLES + NO_ZERO_IN_DATE

উবুন্টুতে /etc/mysql/my.cnf এ আমার সেটিংস:

[mysqld]
sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

set global sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';






console