Computer >> Máy Tính >  >> Lập trình >> MySQL

Sự khác biệt giữa kiểu dữ liệu MySQL DATETIME và TIMESTAMP là gì?


Cả hai kiểu dữ liệu đều lưu trữ dữ liệu ở định dạng “YYYY-MM-DD HH:MM:SS” và bao gồm ngày cũng như thời gian. Bất chấp những điểm tương đồng này, chúng có những điểm khác biệt sau -

  • Phạm vi - Kiểu dữ liệu ngày giờ hỗ trợ ngày cùng với thời gian trong phạm vi từ 1000-01-01 00:00:00 đến 9999-12-31 23:59:59. Tuy nhiên, loại dữ liệu dấu thời gian hỗ trợ ngày cùng với thời gian trong phạm vi từ ‘1970-01-01 00:00:01’ đến ‘2038-01-19 08:44:07’.
  • Kích thước - Datetime yêu cầu 5 byte cùng với 3 byte bổ sung để lưu trữ dữ liệu theo giây phân số. Mặt khác, kiểu dữ liệu dấu thời gian yêu cầu 4 byte cùng với 3 byte bổ sung để lưu trữ dữ liệu theo giây phân đoạn. Nhưng trước MySQL 5.6.4, DateTime yêu cầu 8 byte cùng với 3 byte bổ sung để lưu trữ dữ liệu theo giây phân số.
  • Chuyển đổi từ múi giờ này sang múi giờ khác - Trên thực tế, trong MySQL5 +, giá trị dấu thời gian chuyển đổi từ thời gian hiện tại sang UTC và ngược lại trong khi datetime không thực hiện bất kỳ chuyển đổi nào.
  • Lập chỉ mục - Có thể lập chỉ mục trên dữ liệu dấu thời gian nhưng không thể lập chỉ mục dữ liệu ngày giờ.
  • Lưu vào bộ nhớ cache của truy vấn - các truy vấn có kiểu dữ liệu dấu thời gian có thể được lưu vào bộ nhớ đệm nhưng không thể lưu vào bộ nhớ đệm các truy vấn có kiểu dữ liệu datetime.

Trên đây là một số khác biệt chính giữa kiểu dữ liệu DATETIME và TIMESTAMP và ví dụ sau sẽ chứng minh điều đó -

Ví dụ

mysql> Create table test_datetime(time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);
Query OK, 0 rows affected (0.44 sec)

mysql> INSERT INTO test_datetime (time) values (CURRENT_TIMESTAMP);
Query OK, 1 row affected (0.04 sec)

mysql> Select * from test_datetime;
+---------------------+
| time                |
+---------------------+
| 2017-11-14 17:29:03 |
+---------------------+
1 row in set (0.00 sec)

mysql> Create table test_timestamp(time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);
Query OK, 0 rows affected (0.64 sec)

mysql> INSERT INTO test_timestamp (time) values (CURRENT_TIMESTAMP);
Query OK, 1 row affected (0.06 sec)

mysql> Select * from test_timestamp;
+---------------------+
| time                |
+---------------------+
| 2017-11-14 17:29:50 |
+---------------------+
1 row in set (0.00 sec)

Bây giờ, trong truy vấn sau, chúng tôi đã thay đổi múi giờ thành UTC-05:00 và kết quả được thay đổi cho bảng có kiểu dữ liệu TIMESTAMP.

mysql> SET @@session.time_zone = '-5:00';
Query OK, 0 rows affected (0.00 sec)

mysql> Select * from test_timestamp;
+---------------------+
| time                |
+---------------------+
| 2017-11-14 06:59:50 |
+---------------------+
1 row in set (0.00 sec)

Đầu ra

mysql> Select * from test_datetime;
+---------------------+
| time                |
+---------------------+
| 2017-11-14 17:29:03 |
+---------------------+
1 row in set (0.00 sec)