Cho phép mysql ngày không hợp lệ

Khi đặt giá trị mặc định cho cột kiểu dữ liệu DATE hoặc DATETIME trong MySQL, nếu bạn sử dụng ‘0000-00-00 00. 00. 00’ làm giá trị mặc định, bạn có thể gặp phải lỗi này

ERROR 1067 (42000): Invalid default value for 'column_name'

Hoặc khi chèn giá trị

ERROR 1292 - Incorrect date value: '0000-00-00' 

Lý do là, kể từ phiên bản 5. 7, MySQL bật Chế độ nghiêm ngặt SQL theo mặc định và không cho phép '0000-00-00' làm giá trị ngày hợp lệ

Các bước để sửa lỗi này

1. Kiểm tra chế độ MySQL

Bạn có thể xem chế độ SQL từ tệp cấu hình MySQL hoặc chạy lệnh này

SELECT @@GLOBAL.sql_mode global, @@SESSION.sql_mode session

2. Tắt chế độ nghiêm ngặt

Nếu chế độ nghiêm ngặt được bật, thì một trong hai hoặc cả STRICT_TRANS_TABLES hoặc STRICT_ALL_TABLES đều được bật. Vì vậy, bạn có thể vô hiệu hóa nó bằng cách nhận xét nó từ tệp cấu hình MySQL hoặc chạy lệnh

SET sql_mode = '';

Hoặc

SET GLOBAL sql_mode = '';

3. Khởi động lại MySQL

Sau đó khởi động lại MySQL và bạn sẽ có thể sử dụng '0000-00-00' làm giá trị cho cột NGÀY hoặc NGÀY


Cần một công cụ GUI tốt cho cơ sở dữ liệu?

Thông tin trong bài viết này được cung cấp nguyên trạng và được sử dụng theo quyết định riêng. Tùy thuộc vào (các) công cụ được sử dụng, (các) tùy chỉnh và/hoặc các yếu tố khác hỗ trợ liên tục cho giải pháp bên dưới có thể không được cung cấp bởi Bộ phận hỗ trợ của Qlik

Chuyển đổi ngày

Một số cơ sở dữ liệu cho phép các giá trị ngày giờ không theo tiêu chuẩn mà khi được sao chép sang cơ sở dữ liệu đích không cho phép cùng một giá trị "Xấu" thì tác vụ sẽ bị lỗi

Ví dụ về điều này là tác vụ sao chép có mySQl làm nguồn và Snowflake làm đích.
Chúng tôi có một mysql DB với một vài bảng có dữ liệu ngày giờ là 0000-00-00 00. 00. 00 , khi chúng tôi đang cố tải dữ liệu này vào bông tuyết, chúng tôi gặp phải lỗi bên dưới.

Lỗi nhật ký tác vụ

00010461. 2021-07-23T17. 09. 30 [TARGET_LOAD ]E. RetCode. SQL_ERROR SqlState. 22007 Lỗi bản địa. Tin nhắn 100035. Dấu thời gian '0000-00-00 00. 00. 00' không được công nhận

Bất kỳ cách nào chúng ta cũng có thể áp dụng chuyển đổi toàn cầu trên dữ liệu để thay đổi dữ liệu từ 0000-00-00 00. 00. 00
Đến 1970-01-01 00. 00. 00?

chuyển đổi toàn cầu

Vì không có cách nào dễ dàng để biết liệu một bảng có luôn có giá trị dữ liệu tốt hay không, nơi tốt nhất để thực hiện kiểu kiểm tra và thay thế này là trên Màn hình chuyển đổi toàn cục của Tác vụ. Có một loại chuyển đổi toàn cục được gọi là Thay thế giá trị cột mà chúng tôi sẽ sử dụng và nó sẽ áp dụng cho tất cả các trường ngày trong tất cả các bảng của tác vụ

Mã chuyển đổi hoàn chỉnh như sau

coalesce(
CASE WHEN substr($AR_M_SOURCE_COLUMN_DATA,1,4) = '0000'
THEN '1970-01-01 00:00:00'
WHEN substr($AR_M_SOURCE_COLUMN_DATA,1,4) = ''
THEN '1970-01-01 00:00:00'
ELSE
$AR_M_SOURCE_COLUMN_DATA
END
,$AR_M_SOURCE_COLUMN_DATA)

Thay thế giá trị cột. ảnh chụp màn hình

Bộ 4 ảnh chụp màn hình sau đây cho biết vị trí và cách định cấu hình Giải pháp chuyển đổi toàn cầu

Cho phép mysql ngày không hợp lệ
Thay thế giá trị cột

Khi ở Màn hình chuyển đổi toàn cầu, chọn Thay thế giá trị cột

Cho phép mysql ngày không hợp lệ
Phạm vi chuyển đổi

Chọn Loại dữ liệu "DATETIME" để định cấu hình tác vụ áp dụng loại này cho tất cả các trường thuộc loại Ngày Giờ

Cho phép mysql ngày không hợp lệ
Hành động chuyển đổi

Nhấp vào Tạo biểu thức để thêm mã chuyển đổi

Cho phép mysql ngày không hợp lệ
Trình tạo biểu thức

Thêm mã chuyển đổi để kiểm tra giá trị ngày "Không hợp lệ" trong trường hợp này là chuỗi rỗng hoặc chuỗi rỗng, sau đó đặt giá trị thành "1970-01-01 00. 00. 00" là ngày có thể chấp nhận được đối với mục tiêu Snowflake

Lý do điều này không thành công là do xác thực ngày bổ sung được thêm vào MySql 8.

Bạn có thể tìm thấy hành vi mới và giải pháp khả thi trong danh sách dấu đầu dòng "Hãy nhận biết một số thuộc tính nhất định của diễn giải giá trị ngày trong MySQL. " tìm thấy trong liên kết này. đây. https. // nhà phát triển. mysql. com/doc/refman/8. 0/vi/ngày giờ. html

"Máy chủ yêu cầu các giá trị tháng và ngày phải hợp lệ và không chỉ trong phạm vi từ 1 đến 12 và 1 đến 31,

     tương ứng. Khi chế độ nghiêm ngặt bị tắt, các ngày không hợp lệ như '2004-04-31' được chuyển đổi thành '0000-00-00' và

     cảnh báo được tạo. Với chế độ nghiêm ngặt được bật, ngày không hợp lệ sẽ tạo ra lỗi. Để cho phép những ngày như vậy, hãy bật

     ALLOW_INVALID_DATES. Xem Phần 5. 1. 11, “Chế độ máy chủ SQL”, để biết thêm thông tin. "

Liên kết này cũng đề cập đến sự thay đổi. https. // stackoverflow. com/questions/58431136/how-to-fix-mysql-8-error-codes-1525-and-1292

Nó cũng có bản demo rất hay. https. // db câu đố. anh/?rdbms=mysql_8. 0&fiddle=f48ec79ab2e127a795942b1c2dc25cab

Vì vậy, để cho phép loại ngày xấu này được lưu mà không gặp lỗi hoặc không bị cơ sở dữ liệu chuyển đổi, bạn có thể thử thêm ALLOW_INVALID_DATES vào sqlMode. Bạn có thể thực hiện việc này trên máy chủ như trong bản trình diễn được liên kết ở trên hoặc thông qua thuộc tính url kết nối JDBC sql_mode hoặc bằng cách đặt sql_mode trong tệp cấu hình trên máy chủ.

Ví dụ.

qua url kết nối.

    jdbc. mysql. //localhost/test?user=sqluser&password=sqluserpw&sessionVariables=sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION,ALLOW_INVALID_DATES'

thông qua tệp cấu hình.

    sessionVariables=sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION,ALLOW_INVALID_DATES'

Lưu ý. Có những thay đổi khác đối với kiểu dữ liệu ngày tháng. Nếu bạn cần lưu ngày không hợp lệ do người dùng nhập, bạn có thể thử lưu dưới dạng chuỗi thay vì ngày. Điều đó sẽ tách biệt quy trình của bạn khỏi các thay đổi xác thực ngày khác không được thảo luận ở trên.

Tài nguyên.

    https. // stackoverflow. com/questions/58431136/how-to-fix-mysql-8-error-codes-1525-and-1292

    https. // vài tháng. com/database-blog/moving-mysql-57-mysql-80-what-you-nên-biết

    https. // nhà phát triển. mysql. com/doc/refman/8. 0/en/mysql-tóm lại. html

    https. // nhà phát triển. mysql. com/doc/refman/8. 0/vi/ngày giờ. html

    https. // nhà phát triển. mysql. com/doc/refman/8. 0/en/sql-mode. html

    https. // db câu đố. anh/?rdbms=mysql_8. 0&fiddle=f48ec79ab2e127a795942b1c2dc25cab

Làm cách nào để cho phép ngày không hợp lệ trong MySQL?

Khi tắt chế độ nghiêm ngặt, các ngày không hợp lệ như '2004-04-31' được chuyển thành '0000-00-00' và cảnh báo được tạo. Với chế độ nghiêm ngặt được bật, ngày không hợp lệ sẽ tạo ra lỗi. Để cho phép những ngày như vậy, hãy bật ALLOW_INVALID_DATES .

Làm cách nào để xác thực ngày trong MySQL?

CẬP NHẬT .
bật chế độ SQL NO_ZERO_DATE. ĐẶT PHIÊN sql_mode = 'NO_ZERO_DATE'
hoặc nếu không, hãy sử dụng một chức năng khác, chẳng hạn như TO_DAYS để xác minh tính hợp lệ của ngày. CHỌN m_dob TỪ thủy thủ WHERE TO_DAYS(STR_TO_DATE(m_dob, '%d-%b-%Y')) KHÔNG PHẢI LÀ NULL

Làm cách nào để cho phép ngày không trong MySQL?

Để không cho phép phần 0 của tháng hoặc ngày trong ngày, bật chế độ NO_ZERO_IN_DATE . MySQL cho phép bạn lưu trữ giá trị “không” của '0000-00-00' dưới dạng "ngày giả. ” Trong một số trường hợp, điều này thuận tiện hơn so với việc sử dụng các giá trị NULL và sử dụng ít dữ liệu và không gian chỉ mục hơn. Để không cho phép '0000-00-00' , hãy bật chế độ NO_ZERO_DATE.

Làm cách nào để đặt sql_mode trong MySQL 8?

Bạn có thể đặt chế độ SQL mặc định (để khởi động mysqld) bằng tùy chọn --sql-mode. Sử dụng câu lệnh SET [GLOBAL. SESSION] sql_mode='modes ' , bạn có thể thay đổi cài đặt từ bên trong kết nối, cục bộ thành kết nối hoặc có hiệu lực trên toàn cầu.