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


124

আমি মাইএসকিএল সার্ভার 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') এর "শূন্য" মান রূপান্তরিত হয়।

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


11
আপনি কেন এমন একটি ডিফল্ট চান যা স্পষ্টত অর্থহীন? তারিখটি যদি অজানা থাকে তবে ঠিক এটির NULLজন্য।
টম এইচ

একটি দ্রষ্টব্য হিসাবে: এটি এসকিউএল ফিডল - sqlfiddle.com/#!9/02c98 এ 5.6 সংস্করণে কাজ করে ।
গর্ডন লিনফ 14

@ কার্লোস আপডেট হওয়া উত্তরটি দেখুন।
geeksal

উত্তর:


209

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

মাইএসকিউএল ডকুমেন্টেশন 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উবুন্টু হিসাবে যান এবং মন্তব্য করার চেয়ে কাজ না করেSTRICT_TRANS_TABLES

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

বিঃদ্রঃ

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

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

হালনাগাদ

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

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

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

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

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

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

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

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


5
আপডেট উপেক্ষা করুন আমি 👍🏻 খুঁজছেন হয়
Afanasii Kurakin

2
ভুল। আমার STRICT_TRANS_TABLESআমার মাইএসকিউএল উদাহরণ, স্থানীয় এবং সার্ভার রয়েছে। যাইহোক, আমি সহজেই 0000-00-00আমার স্থানীয় উদাহরণটি সন্নিবেশ করতে পারি , তবে আমার সার্ভারের উদাহরণে পারি না - ত্রুটি নিক্ষেপ করা হয়। কেন? কারণ আমার সার্ভার মাইএসকিউএল কনফিগারেশন NO_ZERO_DATEসক্ষম করেছে । এবং আমার স্থানীয় এটি নেই।
সবুজ

ঠিক আছে @ গ্রীন আমি প্রযোজ্য হলে উত্তরটি খুঁজে বের করব এবং আপডেট করব
জিক্সাল

4
আমার ক্ষেত্রে 'SET sql_mode = "" কাজ করে নি। 'SET GLOBAL sql_mode = "";' আমার জন্য কাজ করেছে।
আরজেন স্টেনস

এছাড়াও NO_ZERO_DATEসরানো উচিত
প্রেসন প্রদীপ

18

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

সমাধান :

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

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_TRANS_TABLESবা উভয়ই STRICT_ALL_TABLESসক্ষম বা সক্ষম থাকা মোড । ডকুমেন্টেশন বলেছেন:

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


14

আমি এমন পরিস্থিতিতে পড়েছি যেখানে একটি তারিখের ক্ষেত্রে ডেটা NULL এবং 0000-00-00 এর মধ্যে মিশ্রিত হয়েছিল। তবে আমি কীভাবে '0000-00-00' NULL এ আপডেট করব তা জানতাম না, কারণ

 update my_table set my_date_field=NULL where my_date_field='0000-00-00'

আর অনুমতি দেওয়া হয় না। আমার কাজটি বেশ সহজ ছিল:

update my_table set my_date_field=NULL where my_date_field<'1000-01-01'

কারণ সমস্ত ভুল my_date_fieldমান (সঠিক তারিখ হোক বা না হোক) এই তারিখের আগে থেকেই ছিল।


2
নিখুঁত দ্রুত সমাধান। আপনি <'0000-01-01'অবশ্যই এটি ব্যবহার করতে পারেন যেহেতু এটি অবশ্যই একটি বৈধ তারিখ।
রিকি ম্যাকমাস্টার

5

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

* নিক্স সিস্টেমের অধীনে এমওয়াইএসকিউএল এর কয়েকটি সংস্করণে (পরীক্ষিত 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

প্রথমে বর্তমান সেশনটি নির্বাচন করুন 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'

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

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';

আপনার যদি অনুদান থাকে তবে আপনি এটিগুলি এর জন্যও করতে পারেন GLOBAL:

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

4

শুধু লাইন যুক্ত করুন: sql_mode = "NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

ভিতরে ফাইল: /etc/mysql/mysql.conf.d/mysqld.cnf

তারপর sudo service mysql restart


1
5.7.23 এর জন্য কাজ করে।
ব্যবহারকারী 2513149

1
আমি সম্ভবত SELECT @@SESSION.sql_mode;প্রথমে পরামর্শ দেব এবং সেগুলি আপনাকে যা দেয় তা থেকে NO_ZERO_IN_DATE, NO_ZERO_DATE, এবং স্ট্রিকT_TRANS_TABLES মুছে ফেলবে। আপনি যে কোনও সেটিংস সক্ষম করে রেখেছেন keep আমার এসকিএল মোডের জন্য সেট করা দুটি আইটেমের চেয়ে আমার কাছে আরও অনেক কিছু ছিল। তারা সবাই কী করে তা জানেন না তবে আমি এই মুহুর্তে তাদের অপসারণের ঝুঁকি নিতে চাই না।
র‌্যাডলি সাস্টায়ার

2

এটি 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 এর জন্য একটি রিগ্রেশন বাগ হতে পারে।


1

মাইএসকিউএল ওয়ার্কবেঞ্চের সাথে সমস্যাটি সমাধান করার জন্য (সমাধানটি সার্ভারের দিকে প্রয়োগ করার পরে):

অগ্রাধিকার প্যানেলে SQL_MODE থেকে TRADITIONAL এ সরান।

এখানে চিত্র বর্ণনা লিখুন


1

এই উত্তরটি কেবল মাইএসকিউএল 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, পরামিতিগুলি অগ্রাহ্য করার আগে, সুতরাং আপনার এটিও মুছতে হবে।

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

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


0

জন্য বিকল্প সংমিশ্রণ 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"


0

ডিরেক্টরী xamp / mysql / bin এ "my.ini" খুলুন এবং লাইন পরিবর্তন করুন: - এর জন্য SQL_নোড

"Sql_mode = NO_ENGINE_SUBSTITUTION, NO_ZERO_DATE"

"NO_ZERO_IN_DATE" সরান


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