মাইএসকিউএল ভুল তারিখের সময় মান: '0000-00-00 00:00:00'


155

আমি সম্প্রতি 10 বছর আগে তৈরি একটি পুরানো প্রকল্প হাতে নিয়েছি। এটি মাইএসকিউএল 5.1 ব্যবহার করে।

অন্যান্য জিনিসের মধ্যে, আমার ডিফল্ট অক্ষর সেটটি ল্যাটিন 1 থেকে utf8 এ পরিবর্তন করতে হবে।

উদাহরণ হিসাবে, আমার কাছে এর মতো টেবিল রয়েছে:

  CREATE TABLE `users` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    `first_name` varchar(45) CHARACTER SET latin1 COLLATE latin1_general_ci DEFAULT NULL,
    `last_name` varchar(45) CHARACTER SET latin1 COLLATE latin1_general_ci DEFAULT NULL,
    `username` varchar(127) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL,
    `email` varchar(127) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL,
    `pass` varchar(20) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL,
    `active` char(1) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL DEFAULT 'Y',
    `created` datetime NOT NULL,
    `last_login` datetime DEFAULT NULL,
    `author` varchar(1) CHARACTER SET latin1 COLLATE latin1_general_ci DEFAULT 'N',
    `locked_at` datetime DEFAULT NULL,
    `created_at` datetime DEFAULT NULL,
    `updated_at` datetime DEFAULT NULL,
    `ripple_token` varchar(36) CHARACTER SET latin1 COLLATE latin1_general_ci DEFAULT NULL,
    `ripple_token_expires` datetime DEFAULT '2014-10-31 08:03:55',
    `authentication_token` varchar(255) CHARACTER SET latin1 COLLATE latin1_general_ci DEFAULT NULL,
    PRIMARY KEY (`id`),
    UNIQUE KEY `index_users_on_reset_password_token` (`reset_password_token`),
    UNIQUE KEY `index_users_on_confirmation_token` (`confirmation_token`),
    UNIQUE KEY `index_users_on_unlock_token` (`unlock_token`),
    KEY `users_active` (`active`),
    KEY `users_username` (`username`),
    KEY `index_users_on_email` (`email`)
  ) ENGINE=InnoDB AUTO_INCREMENT=1677 DEFAULT CHARSET=utf8 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC

এটিতে কাজ করার জন্য আমি আমার নিজস্ব ম্যাক সেট আপ করেছি। এ সম্পর্কে খুব বেশি চিন্তা না করেই আমি "ব্রিউ ইনস্টল মাইএসকিএল" চালিয়েছি যা মাইএসকিউএল 5.7 ইনস্টল করেছে। সুতরাং আমি কিছু সংস্করণ বিবাদ আছে।

আমি এই ডাটাবেসের একটি অনুলিপি ডাউনলোড করেছি এবং এটি আমদানি করেছি।

যদি আমি এই জাতীয় একটি কোয়েরি চালানোর চেষ্টা করি:

  ALTER TABLE users MODIFY first_name varchar(45) CHARACTER SET utf8 COLLATE utf8_general_ci    NOT NULL  

আমি এই ত্রুটি পেয়েছি:

  ERROR 1292 (22007): Incorrect datetime value: '0000-00-00 00:00:00' for column 'created' at row 1

আমি ভেবেছিলাম আমি এটি দিয়ে এটি ঠিক করতে পারি:

  ALTER TABLE users MODIFY created datetime  NULL DEFAULT '1970-01-01 00:00:00';
  Query OK, 0 rows affected (0.06 sec)
  Records: 0  Duplicates: 0  Warnings: 0

তবে আমি পেয়েছি:

  ALTER TABLE users MODIFY first_name varchar(45) CHARACTER SET utf8 COLLATE utf8_general_ci    NOT NULL ;
  ERROR 1292 (22007): Incorrect datetime value: '0000-00-00 00:00:00' for column 'created' at row 1

আমাকে কি প্রতিটি মান আপডেট করতে হবে?

উত্তর:


12

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

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


লুসিয়া পাসারিন, আমি আপনার ধারণাটি খুব পছন্দ করি, তবে ডেটা কাটা হবে না? কিছু ইউটিএফ 8 ডেটা ল্যাটিন 1 এর চেয়ে বেশি বাইট নেয়? পূর্বে ভারচার 255 তে কিছু ফিট থাকলে সম্ভবত এখন তা হবে না? আমি, সম্ভবত, সমস্ত ভারচারগুলি "পাঠ্য" ক্ষেত্রগুলিতে পরিবর্তন করব?
Lorm

হ্যাঁ তুমিই ঠিক. এটি ঘটতে পারে যেহেতু ল্যাটিন 1 প্রতি চার প্রতি 1 বাইট ব্যবহার করে, যেখানে ইউটিএফ 8 প্রতি চার্জে সর্বাধিক 4 বাইট ব্যবহার করে (মাইএসকিউএল সংস্করণ এবং utf8 dev.mysql.com/doc/refman/5.5/en/charset- ইউনিকোডের ধরণের উপর নির্ভর করে) -utf8.html )। অতএব, আপনার অগত্যা পাঠ্য প্রকারের দরকার নেই। আমি ধরে নেব যে আপনার আগের বিদ্যমান আকারগুলি x4 এর কাজ করা উচিত।
লুসিয়া পাসারিন

আপনি যখন কোনও ফাইল মুছতে চান এটি আপনার হার্ড ড্রাইভের পুনরায় ফর্ম্যাট করার সমতূল্য ডাটাবেস। এটি বলা নিরাপদ যে কোনও পরিবেশ পরিবেশে এই সমাধান গ্রহণযোগ্য নয়।
ব্র্যান্ডন

198

আমি এটি করতে সক্ষম হইনি:

UPDATE users SET created = NULL WHERE created = '0000-00-00 00:00:00'

(মাইএসকিউএল 5.7.13 এ)।

আমি Incorrect datetime value: '0000-00-00 00:00:00'ত্রুটি পেতে থাকি ।

স্ট্রেঞ্জলি, এই কাজ: SELECT * FROM users WHERE created = '0000-00-00 00:00:00'। আমার কোনও ধারণা নেই যে প্রাক্তন ব্যর্থ এবং পরবর্তীকালে কেন কাজ করে ... সম্ভবত কোনও মাইএসকিউএল বাগ?

যাইহোক, এই আপডেটের ক্যোয়ারীটি কাজ করেছে:

UPDATE users SET created = NULL WHERE CAST(created AS CHAR(20)) = '0000-00-00 00:00:00'

13
আমারও একই সমস্যা ছিল, তবে শেষ অংশটি ঠিক 0 এ সেট করা আমার জন্য এটি ঠিক করে দিয়েছে:UPDATE users SET created = NULL WHERE created = '0'
ব্রায়ান লেশম্যান

নির্বাচন করুন * entityযেখানে তৈরি করেছেন থেকে = "0000-00-00 00:00:00" ভাল কাজ করুন, তবে একটি আপডেট ব্যর্থতার সাথে! আমারও একই সমস্যা ছিল। @Obe CAST এর সমাধান দিয়ে এটি ঠিক করুন (CHAR (20) হিসাবে তৈরি করা হয়েছে) ... আমি মনে করি এটি একটি বাগ।
ক্রাইসওয়েল

44
আমার জন্য এটি UPDATE users SET created = NULL WHERE created=0প্রায় 'শূন্যের কাছাকাছি
না'র

1
শুধুমাত্র টাইমস্ট্যাম্প ছাড়াই "0000-00-00" তারিখের পরিবর্তনের জন্য, আমি CHAR (11)
D.

1
এটি খাঁটি প্রতিভা। কেন এটি গৃহীত উত্তর নয়? তারিখের জন্য কেবল টাইমস্ট্যাম্প ছাড়াই সর্বনিম্ন মান হয় 1000-01-01। আপনি খালি ছেড়ে যাওয়ার বা 0000-00-00 মান সহ প্রতিটি তারিখের অ্যাট্রিবিউটটির জন্য এটি ডিফল্ট মান হিসাবে বিবেচনা করুন।
আরভানাইটিস ক্রিস্টোস

155

একটি ALTER TABLEবিবৃতি সহ কলামের জন্য ডিফল্ট মান পরিবর্তন করা , যেমন

 ALTER TABLE users MODIFY created datetime  NULL DEFAULT '1970-01-02'

... ইতিমধ্যে সঞ্চিত কোনও মান পরিবর্তন করে না। "ডিফল্ট" মান সন্নিবেশ করা সারিগুলিতে প্রয়োগ হয় এবং যার জন্য কলামের জন্য কোনও মান সরবরাহ করা হয় না।


আপনি কেন ত্রুটির মুখোমুখি হচ্ছেন, এটি সম্ভবত sql_modeআপনার সেশনের সেটিংটিতে অন্তর্ভুক্ত রয়েছে NO_ZERO_DATE

তথ্যসূত্র: http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_no_zero_date

আপনি যখন "আমদানি" করেছিলেন, তখন এসকিউএল বিবৃতিগুলি যে সারণিতে INSERT করেছিল তা একটি সেশনে চালিত হয়েছিল যা শূন্য তারিখের জন্য অনুমতি দেয়।

Sql_mode সেটিংটি দেখতে:

SHOW VARIABLES LIKE 'sql_mode' ;

-অথবা-

SELECT @@sql_mode ;

বর্তমান সমস্যাটি কীভাবে "ফিক্স" করা যায়, যাতে আপনি ALTER TABLEবিবৃতি চালানোর সময় ত্রুটিটি ছুঁড়ে ফেলা হয় না ।

বিভিন্ন বিকল্প:

1) sql_modeঅপসারণ করে NO_ZERO_DATEএবং শূন্য তারিখগুলির অনুমতি দেওয়ার জন্য পরিবর্তন করুন NO_ZERO_IN_DATE। পরিবর্তনটি my.cnf ফাইলে প্রয়োগ করা যেতে পারে, তাই মাইএসকিউএল সার্ভার পুনরায় চালু করার পরে, sql_modeভেরিয়েবলটি my.cnf- এ সেটিংসে আরম্ভ করা হবে।

অস্থায়ী পরিবর্তনের জন্য, আমরা বিশ্বব্যাপী পরিবর্তন না করেই একক সেশনের সাথে সেটিংসটি পরিবর্তন করতে পারি।

-- save current setting of sql_mode
SET @old_sql_mode := @@sql_mode ;

-- derive a new value by removing NO_ZERO_DATE and NO_ZERO_IN_DATE
SET @new_sql_mode := @old_sql_mode ;
SET @new_sql_mode := TRIM(BOTH ',' FROM REPLACE(CONCAT(',',@new_sql_mode,','),',NO_ZERO_DATE,'  ,','));
SET @new_sql_mode := TRIM(BOTH ',' FROM REPLACE(CONCAT(',',@new_sql_mode,','),',NO_ZERO_IN_DATE,',','));
SET @@sql_mode := @new_sql_mode ;

-- perform the operation that errors due to "zero dates"

-- when we are done with required operations, we can revert back
-- to the original sql_mode setting, from the value we saved
SET @@sql_mode := @old_sql_mode ;

2) createdNULL মানগুলিকে অনুমতি দেওয়ার জন্য কলামটি পরিবর্তন করুন এবং শূন্য তারিখগুলি নাল মানগুলিতে পরিবর্তন করতে বিদ্যমান সারিগুলি আপডেট করুন

3) শূন্য তারিখগুলিকে বৈধ তারিখে পরিবর্তন করতে বিদ্যমান সারিগুলি আপডেট করুন


প্রতিটি সারি আপডেট করার জন্য আমাদের পৃথক স্টেটমেন্ট চালানোর দরকার নেই। আমরা একটি স্রোতে সমস্ত সারি আপডেট করতে পারি (ধরে নিলাম এটি একটি যুক্তিসঙ্গত আকারের টেবিল। বৃহত্তর টেবিলের জন্য, হ্রাসযুক্ত রোলব্যাক / পূর্বাবস্থা পূর্বাবস্থা এড়ানোর জন্য, আমরা যুক্তিসঙ্গত আকারের অংশগুলিতে অপারেশনটি সম্পাদন করতে পারি))

প্রশ্নে, AUTO_INCREMENTটেবিল সংজ্ঞাটির জন্য প্রদর্শিত মান আমাদের আশ্বাস দেয় যে সারিগুলির সংখ্যা অতিরিক্ত নয়।

আমরা যদি মানগুলি createdঅনুমোদনের জন্য কলামটি ইতিমধ্যে পরিবর্তন করেছি তবে আমরা NULLএরকম কিছু করতে পারি:

UPDATE  `users` SET `created` = NULL WHERE `created` = '0000-00-00 00:00:00'

বা, আমরা সেগুলি একটি বৈধ তারিখে সেট করতে পারি, যেমন 2 শে জানুয়ারী, 1970

UPDATE  `users` SET `created` = '1970-01-02' WHERE `created` = '0000-00-00 00:00:00'

(নোট যে মধ্যরাত জানুয়ারী 1, 1970 (একটি DATETIME মান '1970-01-01 00:00:00') হয় একটি "শূন্য তারিখ"। সেই হতে মূল্যায়ন করা হবে'0000-00-00 00:00:00'


3
হ্যাঁ, এটি আমার পক্ষে কাজ করেছিল। আমি my.ini ফাইলে স্ক্যালি-মোড অনুসন্ধান করে NO_ZERO_IN_DATE এবং NO_ZERO_DATE সরিয়েছি। তারপরে পরিষেবাটি পুনরায় চালু করুন। ধন্যবাদ spencer7593!
মিলি


আমি যখন # 2 "NULL মানগুলিকে অনুমতি দেওয়ার জন্য তৈরি কলামটি পরিবর্তন করি", তখন এটি আমাকে দেয় না কারণ কলামের মানগুলি এখনও ত্রুটি তৈরি করে। বেশ আটকে আছে।
মাইক ওয়েয়ার

1
@ মাইকেরওয়ের: সম্ভবত " আমাকে যেতে দেবে না " এর অর্থ একটি এসকিউএল স্টেটমেন্ট কার্যকর করা হলে ত্রুটি ফিরে আসে returned সেটি সম্ভবত স্থাপনের কারণে sql_mode। মাইএসকিউএলের আরও সাম্প্রতিক সংস্করণগুলিতে এর ডিফল্ট সেটিংস রয়েছে sql_modeযা পূর্ববর্তী সংস্করণগুলির চেয়ে আরও কড়া। 8.0 এখানে রেফারেন্স: dev.mysql.com/doc/refman/8.0/en/sql-mode.html দেখুন NO_ZERO_DATE, ALLOW_INVALID_DATE, এট অল। মনে রাখবেন যে কিছু কঠোর মোডে যেমন মধ্যে অন্তর্ভুক্ত করা হয় STRICT_TRANS_TABLES, STRICT_ALL_TABLESএবং অন্যান্য কম্বো মোড। নিষেধাজ্ঞাগুলি বাস্তবায়নের জন্য, অধিবেশনটির জন্য অস্থায়ীভাবে স্কয়ার_মডটি সংশোধন করুন
স্পেনসার 7593

@ স্পেনসার 7593 নিশ্চিতভাবে আমি বিকল্পটি সেরা ছিল বলে মনে হয় নি। আমি খুব পুরানো তারিখের মান (1970) নির্ধারণ করার জন্য আপনার পরামর্শ নিয়েছি এবং আমার সিস্টেম এটিকে কেবল এড়িয়ে যাবে। আপনার সমস্ত বিবরণের জন্য ধন্যবাদ।
মাইক ওয়েয়ার 19

67

আমি ক্যোয়ারির আগে এটি করে এটি ঠিক করেছি

SET SQL_MODE='ALLOW_INVALID_DATES';

এই একমাত্র উত্তর। ALLOW_INVALID_DATES '; --init-কমান্ড =' সেট SQL_MODE = সেট, SESSION- FOREIGN_KEY_CHECKS = 0 ': হিসেবে ব্যবহার
Konchog

তোমাকে অনেক ধন্যবাদ. এই সমস্যাটি আমার জন্য কী বেদনাদায়ক ছিল তা ব্যাখ্যা করতে পারছি না।
ডিয়েটার গ্রিবনিটজ

42

মাইএসকিউএল অনুসারে 5.7 রেফারেন্স ম্যানুয়াল :

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

যেহেতু 0000-00-00 00:00:00কোনও বৈধ DATETIMEমান নয় , তাই আপনার ডাটাবেসটি নষ্ট হয়ে গেছে। এই কারণেই মাইএসকিউএল 5.7 - যা NO_ZERO_DATEডিফল্টরূপে সক্ষম মোডের সাথে আসে - আপনি যখন কোনও লেখার ক্রিয়া সম্পাদন করার চেষ্টা করেন তখন একটি ত্রুটি ঘটায় out

আপনি অন্য কোনও বৈধ মানগুলিতে সমস্ত অবৈধ মান আপডেট করে আপনার টেবিলটি ঠিক করতে পারেন, যেমন NULL:

UPDATE users SET created = NULL WHERE created < '0000-01-01 00:00:00'

এছাড়াও, এই সমস্যাটি এড়াতে, আমি আপনাকে সর্বদা আপনার createdপছন্দসই ক্ষেত্রগুলির জন্য ডিফল্ট মান হিসাবে বর্তমান সময় সেট করে রাখি বলে মনে করি , যাতে সেগুলি স্বয়ংক্রিয়ভাবে পূরণ হয় INSERT। শুধু কর:

ALTER TABLE users
ALTER created SET DEFAULT CURRENT_TIMESTAMP

8
SET sql_mode = 'NO_ZERO_DATE';
UPDATE `news` SET `d_stop`='2038-01-01 00:00:00' WHERE `d_stop`='0000-00-00 00:00:00'

4
এটি কেন এই সমস্যার সমাধান করে তা নিয়ে এই উত্তরটির উন্নতি হবে।
কেভিনও

এটি কি ডেটটাইম স্টোরেজকে প্রভাবিত করে? বা কোনও সমস্যা হতে পারে
বাইটস

8

এখানে আমার সমাধান পিএইচপিএমএইডমিন / ফেডোরা 29 / মাইএসকিউএল 8.0 (উদাহরণস্বরূপ):

set sql_mode='SOMETHING'; কাজ করে না , কমান্ড কল সফল তবে কিছুই ছিল না পরিবর্তন।

set GLOBAL sql_mode='SOMETHING'; বিশ্বব্যাপী কনফিগারেশন স্থায়ী পরিবর্তন।

set SESSION sql_mode='SOMETHING'; সেশন কনফিগারেশন পরিবর্তন SESSION ভেরিয়েবল কেবলমাত্র বর্তমান ক্লায়েন্টকে প্রভাবিত করে।

https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html

সুতরাং আমি এটি করি:

  • এসকিউএল_মোডি পান: SHOW VARIABLES LIKE 'sql_mode';
  • ফলাফল : ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
  • ফলাফলটি সরান: NO_ZERO_IN_DATE,NO_ZERO_DATE
  • নতুন কনফিগারেশন সেট করুন: set GLOBAL SQL_MODE='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'

আপনি একই পদ্ধতিতে অন্য মোড সরাতে বা যুক্ত করতে পারেন।

ফ্রেমওয়ার্কগুলি ব্যবহার ও পরীক্ষার জন্য গ্লোবাল পরিবর্তন করতে এটি সহায়ক বা sql_mode প্রতিটি ফাইল বা কোয়েরিগুলির মধ্যে উল্লেখ করা আবশ্যক।

একটি প্রশ্ন থেকে গৃহীত এখানে জিজ্ঞাসা করুন: কীভাবে আই-ডিজেবল-মাইএসকিএল-কড়া-মোড

উদাহরণ: সর্বশেষ জুমলা 4.0-আলফা সামগ্রী ইনস্টল করুন।

সম্পাদনা করুন: পিএইচপিমিডমিনে, যদি আপনার সার্ভারের নিয়ন্ত্রণ থাকে তবে আপনি sql_mode(এবং সমস্ত অন্যান্য পরামিতি) সরাসরি এটিকে পরিবর্তন করতে পারেনPlus > Variables > sql_mode


5

আপনি ধরণ পরিবর্তন করতে পারেন নির্মিত থেকে ক্ষেত্র datetimeথেকে varchar(255), তাহলে আপনি (আপডেট) সকল রেকর্ড মান আছে সেট করতে পারেন "0000-00-00 00:00:00"থেকে NULL

এখন, আপনি ত্রুটি ছাড়াই আপনার প্রশ্নগুলি করতে পারেন। আপনি শেষ করার পরে, আপনি তৈরি করা ক্ষেত্রের ধরণের পরিবর্তন করতে পারেন datetime


4

আমার এই ত্রুটিটি মাইএসকিউএল 5.6 থেকে 5.7 থেকে আপগ্রেড করার পরেও রয়েছে

আমি বুঝতে পেরেছিলাম যে আমার পক্ষে সবচেয়ে ভাল সমাধানটি হ'ল এখানে কয়েকটি সমাধানকে একত্রিত করা এবং নূন্যতম ইনপুটটির সাথে কাজ করে এমন কিছু তৈরি করা।

আমি ইন্টারফেসের মাধ্যমে প্রশ্নগুলি প্রেরণের সরলতার জন্য MyPHPAdmin ব্যবহার করি কারণ আমি তখন কাঠামোটি এবং সহজেই যাচাই করতে পারি। আপনি সরাসরি এসএসএস বা অন্য কোনও ইন্টারফেস ব্যবহার করতে পারেন। পদ্ধতিটি একইভাবে বা একই রকম হওয়া উচিত।

...

1।

প্রথমে ডিবিটি মেরামত করার চেষ্টা করার সময় আসল ত্রুটিটি পরীক্ষা করে দেখুন:

joomla.jos_menu দ্রষ্টব্য: পুরানো ফর্ম্যাটটির TIME / TIMESTAMP / DATETIME কলামগুলি নতুন ফর্ম্যাটে আপগ্রেড করা হয়েছে।

সতর্কতা: ভুল তারিখের সময় মূল্য: '0000-00-00 00:00:00' সারি 1 এ 'চেক_আউট_টাইম' কলামের জন্য

ত্রুটি: 'পরীক্ষিত_আউট_টাইম' এর জন্য অবৈধ ডিফল্ট মান

স্থিতি: অপারেশন ব্যর্থ

এটি আমাকে টেবিলের চেক_আউট_টাইমটি বলেছে জোস_মেনুতে সমস্ত খারাপ তারিখের পাশাপাশি "ডিফল্ট" পরিবর্তন হওয়া দরকার।

...

2।

আমি ত্রুটি বার্তায় থাকা তথ্যের উপর ভিত্তি করে এসকিউএল কোয়েরি চালিত করি:

UPDATE jos_menu SET checked_out_time = '1970-01-01 08:00:00' WHERE checked_out_time = 0

আপনি যদি কোনও ত্রুটি পান তবে পরিবর্তে নীচের ক্যোয়ারীটি ব্যবহার করতে পারেন যা সর্বদা কাজ করে বলে মনে হয়:

UPDATE jos_menu SET checked_out_time = '1970-01-01 08:00:00' WHERE CAST(checked_out_time AS CHAR(20)) = '0000-00-00 00:00:00'

...

3।

তারপরে এটি হয়ে গেলে আমি দ্বিতীয় এসকিউএল কোয়েরি চালিত করি:

ALTER TABLE `jos_menu` CHANGE `checked_out_time` `checked_out_time` DATETIME NULL DEFAULT CURRENT_TIMESTAMP;

বা ক্ষেত্রে এটি একটি তারিখ যা নুল হতে হবে

ALTER TABLE `jos_menu` CHANGE `checked_out_time` `checked_out_time` DATETIME NULL DEFAULT NULL;

...

আমি এখন মেরামত ডাটাবেস চালানো হলে আমি পেতে:

joomla.jos_menu ঠিক আছে

...

ঠিক কাজ করে :)


4

চেক

SELECT @@sql_mode;

আপনি যদি সেখানে 'ZERO_DATE' স্টাফ দেখতে পান তবে চেষ্টা করুন

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'NO_ZERO_DATE',''));   
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'NO_ZERO_IN_DATE',''));   

লগ আউট করুন এবং আবার আপনার ক্লায়েন্টে ফিরে আসুন (এটি আশ্চর্যজনক) এবং আবার চেষ্টা করুন


3

স্কেল মোডটি অ-কঠোর করুন

যদি লারাভেল ব্যবহার করে কনফিগার-> ডাটাবেস যান, মাইএসকিএল সেটিংসে যান এবং কঠোর মোডটি মিথ্যা করে


আমি কি মাইপপ্যাডমিনে এটি করতে পারি?
ডন কিং

পিএইচপিএমআইএডমিন হ'ল প্রকৃত মাইএসকিএল সার্ভারটি ব্যবহার করার জন্য একটি ইন্টারফেস, আপনি যে ইন্টারফেসটি মাইএসকিএল কমান্ড ব্যবহার করছেন তা ইন্টারফেসের সাথে পরিবর্তিত হবে না তা বিবেচ্য নয়। এটি বন্ধ করতে এই কমান্ডটি (সেট করুন sql_mode = '';) বা এটি (গ্লোবাল sql_mode = '';) সেট করুন।
মিলিন্ড চৌধুরী চৌধুরী

1
হ্যাঁ আমি খুঁজে পেয়েছি যে কড়া মোড বন্ধ করার জন্য প্রয়োজনীয় সমস্ত পাতাগুলি my.cnf এর নীচে sql_mode = (এবং এর পরে কিছুই নয়) যুক্ত করছে
ডন কিং

3

আমারও তেমন সমস্যা ছিল তবে আমার ক্ষেত্রে কিছু লাইনের মান নুল ছিল।

সুতরাং প্রথম আমি টেবিল আপডেট:

update `my_table`set modified = '1000-01-01 00:00:00' WHERE modified is null

সমস্যা সমাধান হয়েছে, কমপক্ষে আমার ক্ষেত্রে।


2

আমিও পেয়েছি

এসকিউএলস্টেট [22007]: অবৈধ তারিখের সময় ফর্ম্যাট: 1292 ভুল তারিখের সময় মূল্য: কলামের জন্য '0000-00-00 00:00:00'

ত্রুটি তথ্য

এটিকে পরিবর্তন 0000-00-00 00:00:00 করে ঠিক করুন 1970-01-01 08:00:00

1970-01-01 08:00:00 ইউনিক্স টাইমস্ট্যাম্প 0


1
সমস্যাটি হ'ল ওপি তারিখটি পরিবর্তন করতে পারে না কারণ ত্রুটি। আমার ধারণা এটির ত্রুটিটি রয়েছেNO_ZERO_DATE
GusDeCooL

2

Https://support.plesk.com/hc/en-us/articles/115000666509-How-to-change-the-SQL-mode-in-MySQL এ সমাধানটি পেয়েছি । আমার এটি ছিল:

mysql> show variables like 'sql_mode';
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| Variable_name | Value                                                                                                                                     |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| 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 |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set, 1 warning (0.01 sec)

NO_ZERO_IN_DATE,NO_ZERO_DATEউপরের ফলাফলগুলিতে লক্ষ্য করুন । আমি এটি করে এটি সরিয়েছি:

mysql> SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
Query OK, 0 rows affected, 1 warning (0.00 sec)

তারপরে আমার এটি ছিল:

mysql> show variables like 'sql_mode';
+---------------+--------------------------------------------------------------------------------------------------------------+
| Variable_name | Value                                                                                                        |
+---------------+--------------------------------------------------------------------------------------------------------------+
| sql_mode      | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+---------------+--------------------------------------------------------------------------------------------------------------+
1 row in set, 1 warning (0.01 sec)

এটি করার পরে, আমি ALTER TABLEসফলভাবে ব্যবহার করতে পারি এবং আমার টেবিলগুলিকে পরিবর্তন করতে পারি।


1

আমার সমস্যা সমাধানের জন্য আমি এটিই করেছি। আমি স্থানীয় মাইএসকিউএল 5.7 উবুন্টু 18.04 এ পরীক্ষা করেছি

set global sql_mode="NO_ENGINE_SUBSTITUTION";

বিশ্বব্যাপী এই ক্যোয়ারি চালানোর আগে আমি /etc/mysql/conf.d ডিরেক্টরিতে একটি সিএনএফ ফাইল যুক্ত করেছি । সিএনএফ ফাইলের নাম mysql.cnf এবং কোডগুলি

[mysqld]
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ALLOW_INVALID_DATES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

তারপরে আমি মাইএসকিএল পুনরায় চালু করি

sudo service mysql restart

আশা করি এটি কারও সাহায্য করতে পারে।


আমি মাইএসকিউএল সার্ভার পুনরায় চালু না করা পর্যন্ত এই সমাধানটি কাজ করছে। পুনঃসূচনা করার পরেও মানটি NO_ENGINE_SUBSTITUTIONসমস্ত কলামে রয়েছে SELECT @@global.sql_mode, @@session.sql_mode, @@sql_mode;তবে এখনও আমি 0000-00-00 00:00:00প্রথম জিজ্ঞাসাটি সম্পাদন না করা অবধি অবৈধ তারিখের জন্য ত্রুটি পেয়েছি set global sql_mode="NO_ENGINE_SUBSTITUTION";কোনও ধারণা?
স্মাট্টি

আমার ক্ষেত্রে সমাধানটি NO_ZERO_IN_DATE,NO_ZERO_DATEহ'ল আপনার সংস্করণটি my.ini লাইনের সংজ্ঞাটি মুছে ফেলা হবে sql_mode
স্মামতি

1

এটি অবিশ্বাস্যরূপে কুৎসিত, তবে এটি আমার জন্য দ্রুত সমস্যাটিও ঠিক করে দিয়েছে। আপনার টেবিলের জন্য একটি অনন্য কী প্রয়োজন যা আপনি কলঙ্কযুক্ত কলামগুলি সংশোধন করতে ব্যবহার করবেন। এই উদাহরণে, প্রাথমিক কীটিকে 'আইডি' বলা হয় এবং ভাঙা টাইমস্ট্যাম্প কলামটিকে 'ব্যাড কলাম' বলে।

  1. কলঙ্কযুক্ত কলামগুলির আইডি নির্বাচন করুন।

    select id from table where BadColumn='0000-00-00 00:00:00'

  2. কমা-বিস্মৃত স্ট্রিংয়ে আইডি সংগ্রহ করুন। উদাহরণ: 1, 22, 33। আমি এগুলি (একটি পার্ল স্ক্রিপ্ট) এর জন্য একটি বাহ্যিক মোড়ক ব্যবহার করে তাড়াতাড়ি সমস্তকে ছিটকে ফেললাম।

  3. একটি কার্যকর তারিখ (1971 থেকে 2038 এর মধ্যে) সহ পুরানো কলামগুলি আপডেট করতে আপনার আইডিগুলির তালিকা ব্যবহার করুন।

    update table set BadColumn='2000-01-01 00:00:00' where id in (1, 22, 33)


1

আমার সমাধান

SET sql_mode='';
UPDATE tnx_k2_items
SET created_by = 790
, modified = '0000-00-00 00:00:00'
, modified_by = 0

1

পরিবর্তে

UPDATE your_table SET your_column = new_valid_value where your_column = '0000-00-00 00:00:00';

ব্যবহার

UPDATE your_table SET your_column = new_valid_value where your_column = 0;

0

আপনি যদি ম্যানুয়ালি ডেটা প্রবেশ করে থাকেন তবে আপনি TIMESTAMP (6) .000000 তে মান এবং শূন্যগুলি অপসারণের বিষয়টি বিবেচনা করতে পারেন যাতে এটি টাইমস্ট্যাম্পে পরিণত হয়। এটা আমার সাথে ভাল কাজ করেছে।

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