Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

mysql sửa ngày không hợp lệ

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 đó.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kết nối với DB từ một Tiện ích mở rộng của Chrome?

  2. gạch nối theo thứ tự MySQL theo mệnh đề

  3. Cách cấp tất cả các đặc quyền trên cơ sở dữ liệu trong MySQL

  4. Percona Live Dublin - Tóm tắt sự kiện và các phiên của chúng tôi

  5. SQL Injection cấp hai là gì