Saya menjalankan MySql Server 5.7.11 dan kalimat ini:
updated datetime NOT NULL DEFAULT '0000-00-00 00:00:00'
adalah tidak bekerja. Memberikan kesalahan:
ERROR 1067 (42000): Invalid default value for 'updated'
Tapi berikut ini:
updated datetime NOT NULL DEFAULT '1000-01-01 00:00:00'
hanya bekerja .
Kasus yang sama untuk DATE.
Sebagai catatan samping , ini disebutkan dalam dokumen MySQL :
Jenis DATE digunakan untuk nilai dengan bagian tanggal tetapi tidak ada bagian waktu. MySQL mengambil dan menampilkan nilai DATE dalam format 'YYYY-MM-DD'. Rentang yang didukung adalah '1000-01-01' hingga '9999-12-31'.
bahkan jika mereka juga mengatakan:
Nilai DATE, DATETIME, atau TIMESTAMP tidak valid diubah ke nilai "nol" dari jenis yang sesuai ('0000-00-00' atau '0000-00-00 00:00:00').
Setelah juga memperhitungkan kutipan kedua dari dokumentasi MySQL, adakah yang bisa memberi tahu saya mengapa itu memberikan kesalahan itu?
NULL
.Jawaban:
Kesalahannya karena mode sql yang dapat menjadi mode ketat sesuai dokumentasi MYSQL 5.7 terbaru
Dokumentasi MySQL 5.7 mengatakan :
Untuk memeriksa mode MYSQL
SELECT @@GLOBAL.sql_mode global, @@SESSION.sql_mode session
Menonaktifkan mode STRICT_TRANS_TABLES
Namun untuk mengizinkan format
0000-00-00 00:00:00
Anda harus menonaktifkan mode STRICT_TRANS_TABLES di file konfigurasi mysql atau dengan perintahDengan perintah
SET sql_mode = '';
atau
SET GLOBAL sql_mode = '';
Menggunakan kata kunci
GLOBAL
membutuhkan super previliges dan itu mempengaruhi operasi yang terhubung dengan semua klien sejak saat itujika di atas tidak berfungsi daripada pergi ke
/etc/mysql/my.cnf
(sesuai ubuntu) dan beri komentarSTRICT_TRANS_TABLES
Juga, jika Anda ingin mengatur mode sql secara permanen saat startup server, sertakan
SET sql_mode=''
dimy.cnf
Linux atau MacOS. Untuk windows ini harus dilakukan dalammy.ini
file.Catatan
Namun mode ketat tidak diaktifkan secara default di MYSQL 5.6. Oleh karena itu tidak menghasilkan kesalahan sesuai dokumentasi MYSQL 6 yang mengatakan
MEMPERBARUI
Mengenai masalah bug seperti yang dikatakan oleh @ Dylan-Su:
Saya tidak berpikir ini adalah bug karena cara MYSQL berevolusi dari waktu ke waktu karena beberapa hal diubah berdasarkan peningkatan produk lebih lanjut.
Namun saya memiliki laporan bug terkait lainnya terkait
NOW()
fungsi tersebutBidang tanggal waktu tidak menerima default SEKARANG ()
Catatan Berguna lainnya [lihat Inisialisasi dan Pembaruan Otomatis untuk TIMESTAMP dan DATETIME ]
Pembaruan Mengenai NO_ZERO_DATE
Pada MySQL mulai 5.7.4, mode ini sudah tidak digunakan lagi. Untuk versi sebelumnya Anda harus mengomentari baris masing-masing di file konfigurasi. Lihat dokumentasi MySQL 5.7 pada NO_ZERO_DATE
sumber
STRICT_TRANS_TABLES
untuk kedua instance MySQL saya, lokal dan server. Namun, saya dapat dengan mudah memasukkan0000-00-00
dalam contoh lokal saya, tetapi tidak dapat dalam contoh server saya - kesalahan dilemparkan. Mengapa? Karena konfigurasi MySQL server saya telahNO_ZERO_DATE
diaktifkan. Dan orang lokal saya tidak memilikinya.NO_ZERO_DATE
harus dihapusSaya mengalami kesalahan ini dengan WAMP 3.0.6 dengan MySql 5.7.14.
Solusi :
ubah baris 70 (jika file ini tidak tersentuh) di
c:\wamp\bin\mysql\mysql5.7.14\my.ini
file dariuntuk
dan mulai ulang semua layanan.
Ini akan menonaktifkan mode ketat. Sesuai dokumentasi, "mode ketat" berarti mode dengan salah satu atau keduanya
STRICT_TRANS_TABLES
atauSTRICT_ALL_TABLES
diaktifkan. The dokumentasi mengatakan:sumber
Saya mendapat situasi di mana data dicampur antara NULL dan 0000-00-00 untuk bidang tanggal. Tapi saya tidak tahu bagaimana mengupdate '0000-00-00' menjadi NULL, karena
tidak diperbolehkan lagi. Solusi saya cukup sederhana:
karena semua nilai yang salah
my_date_field
(apakah tanggal yang benar atau tidak) berasal dari sebelum tanggal ini.sumber
<'0000-01-01'
karena itu tentu saja tanggal yang valid.Masalah sintaks konfigurasi
Pada beberapa versi MYSQL (diuji 5.7. *) Di bawah sistem * nix Anda harus menggunakan sintaks ini:
Ini tidak akan berhasil:
tanda hubung tanpa tanda kutip
garis bawahi tanpa tanda kutip
garis bawah dan tanda kutip
Tinjauan yang lebih lengkap tentang nilai konfigurasi dan mode sql:
Cara menyiapkan tanda Mode Sql permanen
sumber
Pertama pilih sesi saat ini
sql_mode
:Kemudian Anda akan mendapatkan nilai default seperti itu :
lalu setel
sql_mode
tanpa'NO_ZERO_DATE'
:Jika Anda memiliki hibah, Anda dapat melakukannya juga untuk
GLOBAL
:sumber
Cukup tambahkan baris:
sql_mode = "NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
file di dalam:
/etc/mysql/mysql.conf.d/mysqld.cnf
kemudian
sudo service mysql restart
sumber
SELECT @@SESSION.sql_mode;
pertama, dan mereka menghapus NO_ZERO_IN_DATE, NO_ZERO_DATE, dan STRICT_TRANS_TABLES dari apa yang diberikannya kepada Anda. Dengan cara itu Anda menyimpan pengaturan lain apa pun yang telah Anda aktifkan. Saya memiliki lebih dari sekadar dua item yang ditetapkan untuk mode sql saya. Tidak tahu apa yang mereka semua lakukan, tetapi saya tidak ingin mengambil risiko menghapus mereka pada saat ini.Ini bekerja untuk 5.7.8:
Anda dapat membuat SQLFiddle untuk membuat ulang masalah Anda.
http://sqlfiddle.com/
Jika berfungsi untuk MySQL 5.6 dan 5.7.8, tetapi gagal pada 5.7.11. Maka itu mungkin bug regresi untuk 5.7.11.
sumber
Untuk mengatasi masalah dengan MySQL Workbench (Setelah menerapkan solusi di sisi server):
Hapus SQL_MODE ke TRADITIONAL di panel preferensi.
sumber
Jawaban ini hanya untuk MySQL 5.7:
Best tidak benar-benar mengosongkan sql_mode, sebagai gantinya gunakan variabel sesi dalam PHP dengan:
Jadi setidaknya Anda menyimpan nilai default lainnya.
Sungguh gila dokumentasi mysql tidak jelas, Anda perlu menghapus nilai defeault ini di sql_mode:
NO_ZERO_IN_DATE, NO_ZERO_DATE, saya mengerti, tetapi di versi mendatang hal ini akan dihentikan.
STRICT_ALL_TABLES, dengan ini, sebelum parameter diabaikan, jadi Anda perlu menghapusnya juga.
Akhirnya TRADISIONAL juga, tetapi dokumentasi berbicara tentang parameter ini: "berikan kesalahan alih-alih peringatan" saat memasukkan nilai yang salah ke dalam kolom ", dengan parameter ini, tanggal dengan nilai nol tidak dimasukkan, tetapi tanpa ya.
MySQL tidak benar-benar diatur dengan parameter dan kombinasi ini.
sumber
Kombinasi opsi untuk
mysql Ver 14.14 Distrib 5.7.18, for Linux (x86_64)
.Tidak melempar:
STRICT_TRANS_TABLES
+NO_ZERO_DATE
Melempar:
STRICT_TRANS_TABLES
+NO_ZERO_IN_DATE
Pengaturan saya di
/etc/mysql/my.cnf
Ubuntu:sumber
sumber
Di direktori xamp / mysql / bin Buka "my.ini" dan ganti baris: Sql_node for ->
"sql_mode = NO_ENGINE_SUBSTITUTION, NO_ZERO_DATE"
HAPUS "NO_ZERO_IN_DATE"
sumber