ข้อผิดพลาดเกิดจากโหมด sql ซึ่งอาจเป็นโหมดที่เข้มงวดตามเอกสาร MYSQL 5.7 ล่าสุด
เอกสาร MySQL 5.7 พูดว่า :
โหมดเข้มงวดจะส่งผลต่อว่าเซิร์ฟเวอร์อนุญาตให้ "0000-00-00" เป็นวันที่ที่ถูกต้องหรือไม่: หากไม่ได้เปิดใช้งานโหมดเข้มงวดจะอนุญาตให้ใช้ "0000-00-00" และการแทรกจะไม่มีคำเตือน หากเปิดใช้งานโหมดเข้มงวด "0000-00-00" จะไม่ได้รับอนุญาตและการแทรกจะก่อให้เกิดข้อผิดพลาดเว้นแต่จะได้รับ IGNORE ด้วย สำหรับ INSERT IGNORE และ UPDATE IGNORE อนุญาตให้ใช้ "0000-00-00" และส่วนแทรกจะแสดงคำเตือน
เพื่อตรวจสอบโหมด MYSQL
SELECT @@GLOBAL.sql_mode global, @@SESSION.sql_mode session
กำลังปิดโหมด STRICT_TRANS_TABLES
อย่างไรก็ตามในการอนุญาตรูปแบบ0000-00-00 00:00:00
คุณต้องปิดใช้งานโหมด STRICT_TRANS_TABLES ในไฟล์ config mysql หรือตามคำสั่ง
ตามคำสั่ง
SET sql_mode = '';
หรือ
SET GLOBAL sql_mode = '';
การใช้คีย์เวิร์ดนั้นGLOBAL
ต้องการ super previliges และมีผลต่อการดำเนินการที่ไคลเอนต์ทั้งหมดเชื่อมต่อตั้งแต่นั้นเป็นต้นมา
หากข้างต้นใช้งานไม่ได้ให้ไปที่/etc/mysql/my.cnf
(ตาม ubuntu) และแสดงความคิดเห็นSTRICT_TRANS_TABLES
นอกจากนี้หากคุณต้องการตั้งค่าโหมด sql อย่างถาวรเมื่อเริ่มต้นเซิร์ฟเวอร์ให้รวมSET sql_mode=''
ไว้my.cnf
ใน Linux หรือ MacOS สำหรับ windows สิ่งนี้ต้องทำในmy.ini
ไฟล์
บันทึก
อย่างไรก็ตามโหมดเข้มงวดไม่ได้เปิดใช้งานโดยค่าเริ่มต้นใน MYSQL 5.6 ดังนั้นจึงไม่เกิดข้อผิดพลาดตามเอกสารของ MYSQL 6ซึ่งระบุว่า
MySQL อนุญาตให้คุณจัดเก็บค่า "ศูนย์" ของ "0000-00-00" เป็น "วันที่จำลอง" ในบางกรณีสะดวกกว่าการใช้ค่า NULL และใช้พื้นที่ข้อมูลและดัชนีน้อยกว่า หากต้องการไม่อนุญาต "0000-00-00" ให้เปิดใช้งานโหมด SQL NO_ZERO_DATE
UPDATE
เกี่ยวกับปัญหาดังกล่าวโดย @ Dylan-Su:
ฉันไม่คิดว่านี่เป็นข้อผิดพลาดเนื่องจากวิธีการที่ MYSQL มีการพัฒนาตลอดเวลาเนื่องจากมีการเปลี่ยนแปลงบางอย่างตามการปรับปรุงเพิ่มเติมของผลิตภัณฑ์
อย่างไรก็ตามฉันมีรายงานข้อบกพร่องอื่นที่เกี่ยวข้องเกี่ยวกับNOW()
ฟังก์ชันนี้
ฟิลด์ Datetime ไม่ยอมรับค่าเริ่มต้น NOW ()
หมายเหตุที่เป็นประโยชน์อีกประการหนึ่ง [ดูการเริ่มต้นอัตโนมัติและการอัปเดตสำหรับ TIMESTAMP และ DATETIME ]
ตั้งแต่ MySQL 5.6.5 คอลัมน์ TIMESTAMP และ DATETIME สามารถเริ่มต้นโดยอัตโนมัติและอัปเดตเป็นวันที่และเวลาปัจจุบัน (นั่นคือการประทับเวลาปัจจุบัน) ก่อน 5.6.5 นี่เป็นจริงสำหรับ TIMESTAMP เท่านั้นและสำหรับ TIMESTAMP มากที่สุดหนึ่งคอลัมน์ต่อตาราง หมายเหตุต่อไปนี้จะอธิบายถึงการเริ่มต้นอัตโนมัติและการอัปเดตสำหรับ MySQL 5.6.5 ขึ้นไปก่อนจากนั้นข้อแตกต่างสำหรับเวอร์ชันก่อนหน้า 5.6.5
อัปเดตเกี่ยวกับวันที่ NO_ZERO_DATE
เนื่องจาก MySQL ณ 5.7.4 โหมดนี้เลิกใช้งานแล้ว สำหรับเวอร์ชันก่อนหน้าคุณต้องแสดงความคิดเห็นในบรรทัดที่เกี่ยวข้องในไฟล์กำหนดค่า อ้างอิงเอกสาร MySQL 5.7 ในวันที่ NO_ZERO_DATE
NULL
มีไว้เพื่ออะไร