Nilai datetime MySQL salah: '0000-00-00 00:00:00'

155

Saya baru-baru ini mengambil alih proyek lama yang dibuat 10 tahun lalu. Ini menggunakan MySQL 5.1.

Antara lain, saya perlu mengubah set karakter default dari latin1 ke utf8.

Sebagai contoh, saya punya tabel seperti ini:

  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

Saya mengatur Mac saya sendiri untuk mengerjakan ini. Tanpa berpikir terlalu banyak tentang hal itu, saya menjalankan "brew install mysql" yang menginstal MySQL 5.7. Jadi saya punya beberapa konflik versi.

Saya mengunduh salinan database ini dan mengimpornya.

Jika saya mencoba menjalankan kueri seperti ini:

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

Saya mendapatkan kesalahan ini:

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

Saya pikir saya bisa memperbaikinya dengan:

  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

tapi saya mendapatkan:

  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

Apakah saya harus memperbarui setiap nilai?

lorm
sumber

Jawaban:

12

Saran saya jika memang tabelnya kosong atau tidak terlalu besar adalah mengekspor pernyataan create sebagai file .sql, tulis ulang sesuai keinginan. Juga lakukan hal yang sama jika Anda memiliki data yang ada, yaitu pernyataan ekspor masukkan (saya sarankan melakukan ini dalam file terpisah sebagai pernyataan membuat). Akhirnya, letakkan tabel dan jalankan pernyataan create pertama dan kemudian sisipkan.

Anda dapat menggunakan untuk kedua mysqldumpperintah itu, termasuk dalam instalasi MySQL Anda atau Anda juga dapat menginstal MySQL Workbench, yang merupakan alat grafis gratis yang menyertakan juga opsi ini dengan cara yang sangat dapat disesuaikan tanpa harus mencari opsi perintah tertentu.

Lucia Pasarin
sumber
Lucia Pasarin, saya sangat menyukai ide Anda, tetapi tidak akankah data terpotong? Apakah beberapa data UTF8 mengambil lebih banyak byte daripada latin1? Jika sesuatu yang sebelumnya sesuai dengan varchar 255, mungkin sekarang tidak? Haruskah saya, mungkin, mengubah semua varchars menjadi bidang "teks"?
lorm
Ya kamu benar. Itu bisa terjadi karena latin1 menggunakan 1 byte per char, sedangkan utf8 menggunakan paling banyak 4 byte per char (tergantung pada versi MySQL dan pada jenis utf8 dev.mysql.com/doc/refman/5.5/id/charset-unicode -utf8.html ). Karena itu, Anda tidak perlu tipe TEXT. Saya akan berasumsi bahwa x4 ukuran Anda yang sudah ada sebelumnya harus bekerja.
Lucia Pasarin
Ini adalah database yang setara dengan memformat ulang hard drive Anda ketika Anda ingin menghapus file. Aman untuk mengatakan solusi ini tidak dapat diterima di lingkungan produksi.
Brandon
198

Saya tidak dapat melakukan ini:

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

(pada MySQL 5.7.13).

Saya terus mendapatkan Incorrect datetime value: '0000-00-00 00:00:00'kesalahan.

Anehnya, ini bekerja: SELECT * FROM users WHERE created = '0000-00-00 00:00:00'. Saya tidak tahu mengapa yang pertama gagal dan yang terakhir berfungsi ... mungkin bug MySQL?

Bagaimanapun, permintaan UPDATE ini berfungsi:

UPDATE users SET created = NULL WHERE CAST(created AS CHAR(20)) = '0000-00-00 00:00:00'
obe
sumber
13
Saya memiliki masalah yang sama, tetapi pengaturan bagian terakhir hanya 0 untuk saya memperbaikinya seperti ini:UPDATE users SET created = NULL WHERE created = '0'
Brian Leishman
SELECT * FROM entityWHERE CreatedAt = "0000-00-00 00:00:00" berfungsi dengan baik, tetapi dengan kegagalan yang diperbarui! Saya memiliki masalah yang sama. Perbaiki dengan solusi @obe CAST (dibuat AS CHAR (20)) ... Saya rasa ini adalah bug.
Chrysweel
44
Bagi saya itu bekerja seperti UPDATE users SET created = NULL WHERE created=0(tanpa 'sekitar nol)
KIR
1
Untuk mengganti tanggal "0000-00-00" hanya tanpa stempel waktu, saya menggunakan CHAR (11)
D.Tanggal
1
Itu jenius murni. Mengapa ini bukan jawaban yang diterima? Untuk tanggal saja tanpa cap waktu, nilai minimum adalah 1000-01-01. Pertimbangkan untuk menggunakan ini sebagai nilai default untuk setiap atribut tanggal yang ingin Anda biarkan kosong atau dengan nilai 0000-00-00.
Arvanitis Christos
155

Mengubah nilai default untuk kolom dengan ALTER TABLEpernyataan, mis

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

... tidak mengubah nilai apa pun yang sudah disimpan. Nilai "default" berlaku untuk baris yang dimasukkan, dan nilai tidak disediakan untuk kolom.


Mengenai mengapa Anda mengalami kesalahan, kemungkinan sql_modepengaturan untuk sesi Anda termasuk NO_ZERO_DATE.

Referensi: http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_no_zero_date

Ketika Anda melakukan "impor", pernyataan SQL yang melakukan INSERT ke dalam tabel itu dijalankan dalam sesi yang memungkinkan nol tanggal.

Untuk melihat pengaturan sql_mode:

SHOW VARIABLES LIKE 'sql_mode' ;

-atau-

SELECT @@sql_mode ;

Sejauh cara "memperbaiki" masalah saat ini, sehingga kesalahan tidak akan dibuang ketika Anda menjalankan ALTER TABLEpernyataan.

Beberapa pilihan:

1) ubah sql_modeuntuk mengizinkan nol tanggal, dengan menghapus NO_ZERO_DATEdan NO_ZERO_IN_DATE. Perubahan dapat diterapkan dalam file my.cnf, jadi setelah restart Server MySQL, sql_modevariabel akan diinisialisasi ke pengaturan di my.cnf.

Untuk perubahan sementara, kami dapat memodifikasi pengaturan dengan satu sesi, tanpa memerlukan perubahan global.

-- 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) ubah createdkolom untuk memungkinkan nilai NULL, dan perbarui baris yang ada untuk mengubah tanggal nol ke nilai nol

3) perbarui baris yang ada untuk mengubah tanggal nol ke tanggal yang valid


Kami tidak perlu menjalankan pernyataan individual untuk memperbarui setiap baris. Kita dapat memperbarui semua baris dalam satu gerakan (dengan asumsi itu adalah tabel berukuran cukup. Untuk tabel yang lebih besar, untuk menghindari rollback / undo generasi yang luar biasa, kita dapat melakukan operasi dalam potongan berukuran cukup.)

Dalam pertanyaan, AUTO_INCREMENTnilai yang ditunjukkan untuk definisi tabel meyakinkan kita bahwa jumlah baris tidak berlebihan.

Jika kami telah mengubah createdkolom untuk memungkinkan NULLnilai, kami dapat melakukan sesuatu seperti ini:

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

Atau, kita dapat mengaturnya ke tanggal yang valid, misalnya 2 Januari 1970

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

(Perhatikan bahwa nilai waktu tengah malam 1 Januari 1970 ( '1970-01-01 00:00:00') adalah "tanggal nol". Itu akan dievaluasi menjadi'0000-00-00 00:00:00'

spencer7593
sumber
3
ya, ini berhasil untuk saya. Saya mencari mode-sql di file my.ini dan menghapus NO_ZERO_IN_DATE dan NO_ZERO_DATE. kemudian memulai kembali layanan. terima kasih spencer7593!
mili
Setel NO_ZERO_DATE: stackoverflow.com/questions/3891896/…
pengguna 1007017
Ketika saya melakukan # 2 "mengubah kolom yang dibuat untuk memungkinkan nilai NULL", itu tidak akan membiarkan saya karena nilai kolom masih menghasilkan kesalahan. Cukup macet.
Mike Weir
1
@ Mike Weir: mungkin " tidak akan membiarkan saya " berarti bahwa kesalahan dikembalikan ketika pernyataan SQL dijalankan. Itu mungkin karena pengaturan sql_mode. Versi MySQL yang lebih baru memiliki pengaturan standar sql_modeyang lebih ketat dari versi sebelumnya. Referensi untuk 8,0 sini: dev.mysql.com/doc/refman/8.0/en/sql-mode.html lihat NO_ZERO_DATE, ALLOW_INVALID_DATE, et al. perhatikan bahwa beberapa termasuk dalam mode STRICT misalnya STRICT_TRANS_TABLES, STRICT_ALL_TABLESdan mode kombo lainnya. Untuk mengatasinya, modifikasi sementara sql_mode untuk sesi ini,
spencer7593
@ spencer7593 pasti. Saya tidak merasa pilihan itu yang terbaik. Saya mengambil saran Anda untuk menetapkan nilai tanggal yang sangat lama (1970) dan sistem saya hanya akan mengabaikannya. Terima kasih atas semua detail Anda.
Mike Weir
67

Saya memperbaikinya dengan melakukan ini sebelum permintaan

SET SQL_MODE='ALLOW_INVALID_DATES';
Tariq Khan
sumber
Ini satu-satunya jawaban. Digunakan sebagai: --init-command = 'SET SESSION FOREIGN_KEY_CHECKS = 0; SET SQL_MODE =' ALLOW_INVALID_DATES '
Konchog
Terima kasih banyak. Tidak bisa menjelaskan betapa sakitnya masalah ini bagi saya.
Dieter Gribnitz
42

Menurut Manual Referensi MySQL 5.7 :

Mode SQL default di MySQL 5.7 mencakup mode ini: ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, dan NO_TUTUTIONSS

Karena 0000-00-00 00:00:00bukan DATETIMEnilai yang valid , basis data Anda rusak. Itulah sebabnya MySQL 5.7 - yang dilengkapi dengan NO_ZERO_DATEmode yang diaktifkan secara default - menghasilkan kesalahan saat Anda mencoba melakukan operasi penulisan.

Anda dapat memperbaiki tabel Anda dengan memperbarui semua nilai yang tidak valid ke nilai lain yang valid, seperti NULL:

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

Juga, untuk menghindari masalah ini, saya sarankan Anda selalu mengatur waktu saat ini sebagai nilai default untuk createdbidang -seperti Anda , sehingga mereka terisi secara otomatis INSERT. Kerjakan saja:

ALTER TABLE users
ALTER created SET DEFAULT CURRENT_TIMESTAMP
Ivan Filho
sumber
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'
Andrew March
sumber
4
Jawaban ini akan ditingkatkan dengan diskusi tentang mengapa ini memecahkan masalah.
KevinO
apakah ini memengaruhi penyimpanan datetime.? atau menyebabkan masalah
Tanyakan Bytes
8

Inilah solusi saya PhpMyAdmin / Fedora 29 / MySQL 8.0 (misalnya):

set sql_mode='SOMETHING'; tidak berfungsi , perintah panggilan berhasil tetapi tidak ada yang berubah.

set GLOBAL sql_mode='SOMETHING'; ubah konfigurasi global, perubahan permanen.

set SESSION sql_mode='SOMETHING'; ubah konfigurasi sesi, variabel SESI hanya memengaruhi klien saat ini.

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

Jadi saya melakukan ini:

  • Dapatkan SQL_MODE: SHOW VARIABLES LIKE 'sql_mode';
  • Hasil: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
  • Hapus hasilnya: NO_ZERO_IN_DATE,NO_ZERO_DATE
  • Tetapkan konfigurasi baru: set GLOBAL SQL_MODE='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'

Anda dapat menghapus atau menambahkan mode lain dengan cara yang sama.

Ini berguna untuk mengubah global untuk menggunakan dan menguji kerangka kerja atau sql_mode harus ditentukan dalam setiap file atau sekelompok pertanyaan.

Diadaptasi dari pertanyaan yang diajukan di sini: bagaimana-bisa-saya-menonaktifkan-mode -sql-ketat

Contoh: instal konten Joomla 4.0-alpha terbaru.

Sunting: Di PhpMyadmin, jika Anda memiliki kontrol server, Anda dapat mengubah sql_mode(dan semua parameter lainnya) langsung diPlus > Variables > sql_mode

Shim-Sao
sumber
5

Anda dapat mengubah jenis diciptakan lapangan dari datetimeke varchar(255), maka Anda dapat mengatur (update) semua catatan yang memiliki nilai "0000-00-00 00:00:00"untuk NULL.

Sekarang, Anda dapat melakukan pertanyaan tanpa kesalahan. Setelah Anda selesai, Anda dapat mengubah jenis bidang diciptakan untuk datetime.

Abdallah Ajlouni
sumber
4

Saya memiliki kesalahan ini juga setelah memutakhirkan MySQL dari 5.6 ke 5.7

Saya menemukan bahwa solusi terbaik bagi saya adalah menggabungkan beberapa solusi di sini dan membuat sesuatu yang bekerja dengan input minimum.

Saya menggunakan MyPHPAdmin untuk kesederhanaan mengirimkan pertanyaan melalui antarmuka karena dengan begitu saya dapat memeriksa struktur dan semua itu dengan mudah. Anda mungkin menggunakan ssh secara langsung atau antarmuka lain. Metode ini harus sama atau sama saja.

...

1.

Pertama-tama periksa kesalahan aktual saat mencoba memperbaiki db:

joomla.jos_menu Catatan: kolom TIME / TIMESTAMP / DATETIME dalam format lama telah ditingkatkan ke format baru.

Peringatan: Nilai datetime salah: '0000-00-00 00:00:00' untuk kolom 'checked_out_time' di baris 1

Galat: Nilai default tidak valid untuk 'checked_out_time'

status: Operasi gagal

Ini memberitahu saya kolom checked_out_time dalam tabel jos_menu perlu memiliki semua tanggal buruk diperbaiki serta "default" berubah.

...

2.

Saya menjalankan query SQL berdasarkan info dalam pesan kesalahan:

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

Jika Anda mendapatkan kesalahan, Anda dapat menggunakan kueri di bawah ini yang sepertinya selalu berfungsi:

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.

Kemudian setelah selesai saya menjalankan query SQL kedua:

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

Atau dalam kasus ini adalah tanggal yang harus NULL

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

...

Jika saya menjalankan database perbaikan sekarang saya mendapatkan:

joomla.jos_menu OK

...

Bekerja dengan baik :)

Don King
sumber
4

Memeriksa

SELECT @@sql_mode;

jika Anda melihat hal-hal 'ZERO_DATE' di sana, coba

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

Logout dan kembali lagi ke klien Anda (ini aneh) dan coba lagi

Commonpike
sumber
3

Jadikan mode sql tidak ketat

jika menggunakan laravel, pergi ke config-> database, pergi ke pengaturan mysql dan buat mode ketat salah

Milind Chaudhary
sumber
Bisakah saya melakukan ini di myphpadmin?
Don King
phpMyAdmin hanyalah antarmuka untuk menggunakan server mysql yang sebenarnya, tidak masalah antarmuka mana yang Anda gunakan perintah mysql tidak akan berubah dengan antarmuka. Coba perintah ini (set sql_mode = '';) atau ini (set global sql_mode = '';) untuk mematikannya.
Milind Chaudhary
1
ya saya menemukan semua yang diperlukan untuk mematikan mode ketat adalah menambahkan sql_mode = (dan tidak ada setelahnya), di bagian bawah my.cnf
Don King
3

Saya memiliki masalah yang sama tetapi dalam kasus saya beberapa baris memiliki nilai NULL.

jadi pertama saya perbarui tabel:

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

masalah terpecahkan, setidaknya dalam kasus saya.

Lenon Tolfo
sumber
2

Saya juga punya

SQLSTATE [22007]: Format datetime tidak valid: 1292 Nilai datetime salah: '0000-00-00 00:00:00' untuk kolom

info kesalahan

Perbaiki ini dengan mengubah 0000-00-00 00:00:00 ke 1970-01-01 08:00:00

1970-01-01 08:00:00 cap waktu unix adalah 0

tekintian
sumber
1
masalahnya adalah OP tidak dapat mengubah tanggal karena kesalahan. Saya kira itu kesalahan dariNO_ZERO_DATE
GusDeCooL
2

Saya menemukan solusinya di https://support.plesk.com/hc/en-us/articles/115000666509-How-to-change-the-SQL-mode-in-MySQL . Saya punya ini:

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)

Perhatikan NO_ZERO_IN_DATE,NO_ZERO_DATEhasil di atas. Saya menghapusnya dengan melakukan ini:

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)

Lalu aku punya ini:

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)

Setelah melakukan itu, saya bisa menggunakan dengan ALTER TABLEsukses dan mengubah tabel saya.

Jaime Montoya
sumber
1

Inilah yang saya lakukan untuk menyelesaikan masalah saya. Saya diuji di MySQL 5.7 ubuntu 18.04 lokal.

set global sql_mode="NO_ENGINE_SUBSTITUTION";

Sebelum menjalankan query ini secara global, saya menambahkan file cnf di direktori /etc/mysql/conf.d . Nama file cnf adalah mysql.cnf dan kode

[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

Kemudian saya restart mysql

sudo service mysql restart

Semoga ini bisa membantu seseorang.

Kalyan Halder Raaz
sumber
Solusi ini berfungsi hingga saya me-restart server MySQL. Bahkan setelah restart nilai NO_ENGINE_SUBSTITUTIONdi semua kolom SELECT @@global.sql_mode, @@session.sql_mode, @@sql_mode;tapi saya masih mendapatkan kesalahan untuk datetime yang tidak valid 0000-00-00 00:00:00sampai saya menjalankan query pertama lagi set global sql_mode="NO_ENGINE_SUBSTITUTION";Ada ide?
Smamatti
Solusi dalam kasus saya adalah menghapus NO_ZERO_IN_DATE,NO_ZERO_DATEversi baris my.ini Anda yang mendefinisikan sql_mode.
Smamatti
1

Ini sangat jelek, tetapi juga memperbaiki masalah dengan cepat untuk saya. Tabel Anda memerlukan kunci unik yang akan Anda gunakan untuk memperbaiki kolom yang tercemar. Dalam contoh ini, kunci utama disebut 'id' dan kolom cap waktu yang rusak disebut 'BadColumn'.

  1. Pilih ID dari kolom yang ternoda.

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

  2. Kumpulkan ID menjadi string yang dibatasi koma. Contoh: 1, 22, 33. Saya menggunakan pembungkus eksternal untuk ini (skrip Perl) dengan cepat memuntahkan semuanya.

  3. Gunakan daftar ID Anda untuk memperbarui kolom lama dengan tanggal yang valid (1971 hingga 2038).

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

felwithe
sumber
1

Solusi saya

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

Dari pada

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

Menggunakan

UPDATE your_table SET your_column = new_valid_value where your_column = 0;
R2D3
sumber
0

Jika Anda memasukkan data secara manual, Anda dapat mempertimbangkan untuk menghapus nilai dan nol pada TIMESTAMP (6) .000000 sehingga menjadi TIMESTAMP. Itu berhasil dengan saya.

Ishak
sumber