Có vẻ như thông báo lỗi của bạn đến từ máy khách MySQL của bạn, không phải máy chủ. Vì vậy, đặt chế độ nghiêm ngặt của máy chủ sẽ không giúp bạn hiển thị những ngày này với ứng dụng khách này.
Có vẻ như bạn có một số ngày kiểu 2012-09-31 hoặc 2013-02-29 trong dữ liệu của mình. Chúng được định dạng đúng nhưng nếu không thì sai. Trong các phiên bản MySQL trước 5.0.2, các phiên bản này không được bắt chính xác khi đi vào dữ liệu của bạn. Bây giờ, máy chủ của bạn, được đặt thành ALLOW_INVALID_DATES
không bịt miệng chúng, mà thay vào đó là chuyển đổi chúng thành '0000-00-00'. Và khách hàng đang sử dụng chúng.
Bước đầu tiên của bạn để làm sạch điều này là xác định các hàng vi phạm. Bạn có thể thử điều này.
Đầu tiên, hãy bật ALLOW_INVALID_DATES
Sau đó, chạy truy vấn này để xem xung quanh bảng của bạn. Không sử dụng SELECT *
SELECT col,col,col,DATE_FORMAT(datecol,'%Y-%m-%d')
FROM mytable
ORDER BY DATE_FORMAT(datecol,'%Y-%m-%d')
Cố gắng tìm ra từ tập hợp kết quả những ngày nào là rác. Chúng có thể được đặt đầu tiên trong câu lệnh chọn lọc này, nhưng bạn sẽ phải loay hoay một chút để tìm chúng.
Tiếp theo, tìm ra cách bạn muốn sửa chúng. Xóa các hàng? Thay đổi ngày thành 1941-12-07 (ngày sống trong ô nhục)? Chúng tôi không thể cho bạn biết bạn cần làm gì ở đây.
Sau đó, sửa chữa chúng. Nếu chỉ có một hoặc hai, hãy sửa từng cái một.
UPDATE mytable
SET datecol='whatever replacement date'
WHERE id='the id of the offending row.'
hoặc
DELETE FROM mytable
WHERE id='the id of the offending row.'
Nếu có hàng nghìn người trong số họ, bạn có thể sửa hàng loạt bằng một cái gì đó như thế này. Tuy nhiên, đừng làm điều này khi chưa giải quyết vấn đề trước hết sức cẩn thận trên máy chủ thử nghiệm. Nếu bạn mắc lỗi, bạn sẽ làm hỏng bảng của mình.
UPDATE mytable
SET datecol='whatever replacement date'
WHERE '0000-00-00' = DATE_FORMAT(datecol,'%Y-%m-%d')
Sau khi bạn đã hoàn tất việc khắc phục sự cố của mình, hãy quay lại và thực hiện SELECT *
, để đảm bảo bạn có tất cả.
Sau đó, tắt ALLOW_INVALID_DATES
và không bao giờ bật lại.
Điều đó sẽ làm sạch mớ hỗn độn. Lưu ý rằng dữ liệu trong thế giới thực luôn có một số hàng không hoàn hảo trong đó.