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

MySQL insert to DATETIME:Sử dụng định dạng ISO ::8601 có an toàn không?

Có vẻ như câu trả lời ngắn gọn cho câu hỏi này là "Không, nó không an toàn" - kết luận này sau một loạt thử nghiệm với MySQL shell. Tuy nhiên, vẫn sẽ đánh giá cao một câu trả lời "lý thuyết" hơn ...

Rõ ràng MySQL engine (theo mặc định) khá tự do trong những gì nó chấp nhận là một ký tự Ngày giờ ngay cả với sql_mode được đặt thành STRICT_ALL_TABLES:không chỉ các dấu phân cách khác nhau được chấp nhận, chúng cũng có thể khác nhau:

INSERT INTO t(dt) VALUES('2012-01,03.04:[email protected]'); -- Query OK, 1 row affected

Ngoài ra, nếu chuỗi quá ngắn, nó sẽ được đệm bằng các số 0 ... nhưng có thể có bất ngờ:

INSERT INTO t(dt) VALUES('2012011'); -- 2020-12-01 01:00:00 is what's inserted

Điều đáng buồn là chuỗi quá dài (khi chữ số có thể phân tích cú pháp cuối cùng được theo sau bởi một thứ khác ngoài khoảng trắng) sẽ được coi là một giá trị không hợp lệ trong chế độ nghiêm ngặt:

mysql> INSERT INTO t(dt) VALUES('2012-06-27T05:25Z');
ERROR 1292 (22007): Incorrect datetime value: '2012-06-27T05:25Z' for column 'dt' at row 1
mysql> INSERT INTO t(dt) VALUES('2012-06-27T05:25');
Query OK, 1 row affected (0.10 sec)

Ở chế độ truyền thống, phân tích cú pháp thậm chí còn thoải mái hơn - nhưng không chính xác hơn; bên cạnh đó, các chuỗi được coi là không chính xác trong chế độ nghiêm ngặt sẽ đưa ra loại 'cảnh báo im lặng', mặc dù các hoạt động sẽ thành công:

mysql> INSERT INTO t(dt) VALUES('2012-06-27T05:25Z');
Query OK, 1 row affected, 1 warning (0.10 sec)

mysql> SHOW WARNINGS;
+---------+------+---------------------------------------------+
| Warning | 1264 | Out of range value for column 'dt' at row 1 |
+---------+------+---------------------------------------------+

mysql> SELECT dt FROM t;
+---------------------+
| dt                  |
+---------------------+
| 2012-06-27 05:25:00 |
+---------------------+

Điểm mấu chốt là chúng tôi phải viết lại một số mã liên quan đến DAL để ngày tháng (và ngày giờ) luôn được gửi đến DB ở dạng "chuẩn hóa". Tôi tự hỏi tại sao chính chúng tôi là người phải làm điều đó, chứ không phải các nhà phát triển Zend_Db. Nhưng đó là một câu chuyện khác, tôi cho là vậy. )



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL Làm thế nào để CHỌN dữ liệu từ bảng được ghi lại ngày hôm nay?

  2. Không thể chuyển đổi giá trị ngày / giờ của MySQL thành System.DateTime trong VS2010

  3. MySQL Group By và Sum tổng giá trị của cột khác

  4. Tính tổng thời lượng trong MySQL

  5. PHP - MySQL - Xóa hàng