MySQL so sánh DATETIME và TIMESTAMP

0
241

Sự khác nhau giữa DATETIME và TIMESTAMP trong MySQL.
Một câu hỏi đơn giản có thể xuất hiện trong đầu anh em design database là khi làm việc với MySQL là “Có nên để kiểu dữ liệu DATETIME hoặc TIMESTAMP cho một cột vì cả hai dường như đều lưu trữ cùng một dữ liệu?”. Mặc dù chúng lưu trữ cùng một dữ liệu nhưng chúng khác nhau theo một số cách và hãy cùng tìm hiểu những điều đó với sự trợ giúp của một ví dụ nhỏ.

MySQL nên dùng datetime hay timestamp
Kiểu dữ liệu MySQL DATETIME vs TIMESTAMP

Sự tương đồng giữa DATETIME và TIMESTAMP

  • Cả hai cùng định dạng theo chuẩn “YYYY-MM-DD HH:MM:SS”
  • Cả hai đều bao gồm ngày cũng như phần thời gian
  • Cả hai đều có thể khởi tạo giá trị tự động
  • Cả hai đều thay đổi dữ liệu trong khi cập nhật bản ghi với thời gian dữ liệu hiện tại theo ràng buộc
  • Cả hai đều có thể có phần giây phân số có độ chính xác lên đến 6 chữ số micro giây

Sựa khác nhau giữa DATETIME và TIMESTAMP

  • Phạm vi: DATETIME từ ‘1000-01-01 00:00:00‘ tới ‘9999-12-31 23:59:59‘ trong khi TIMESTAMP, là từ ‘1970-01-01 00:00:01‘ UTC tới ‘2038-01-09 03:14:07‘ UTC
  • Trước MySQL 5.6.4, TIMESTAMP yêu cầu 4 byte (+3 byte cho giây phân số) để lưu trữ dữ liệu trong khi DATETIME yêu cầu 8 byte (+3 byte cho giây phân số)
  • Kể từ MySQL 5.6.4, DATETIME yêu cầu 5 byte + 3 byte bổ sung để lưu trữ dữ liệu phân đoạn giây
  • Trong MySQL5 +, giá trị TIMESTAMP chuyển đổi từ thời điểm 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
  • TIMESTAMP khác với cài đặt múi giờ hiện tại trong khi DATETIME không đổi
  • Dữ liệu TIMESTAMP có thể được lập chỉ mục INDEX trong khi dữ liệu DATETIME không thể được lập chỉ mục INDEX
  • Các truy vấn với DATETIME sẽ không được lưu vào bộ nhớ đệm nhưng các truy vấn với TIMESTAMP sẽ được lưu vào bộ nhớ đệm

Ví dụ DATETIME

Múi giờ hệ thống của tôi là IST, vì vậy theo mặc định, MySQL sử dụng múi giờ IST

mysql> CREATE TABLE `employee` (
 `entry_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=latin1

mysql> INSERT INTO `employee` (`entry_time`) VALUES (CURRENT_TIMESTAMP);

mysql> SELECT * FROM `employee`;

// OUTPUT

entry_time 
___________________
2021-07-27 07:38:07

Bây giờ, hãy thay đổi múi giờ hệ thống từ IST thành EST, tức là UTC – 05:00 trong những tháng lạnh của Giờ tiết kiệm ánh sáng ban ngày

mysql> SET @@session.time_zone = '-05:00';
mysql> INSERT INTO `employee` (`entry_time`) VALUES (CURRENT_TIMESTAMP);
mysql> SELECT * FROM `employee`;

// OUTPUT

entry_time
____________________
2021-07-27 07:38:07
2021-07-27 07:45:01

Ví dụ TIMESTAMP

Kết quả vẫn giống nhau mặc dù chúng tôi đã thay đổi múi giờ

mysql> CREATE TABLE `employee` (
 `entry_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=latin1
mysql> INSERT INTO `employee` (`entry_time`) VALUES (CURRENT_TIMESTAMP);
mysql> SELECT * FROM `employee`;

// OUTPUT

entry_time
___________________
2021-07-27 07:49:33
mysql> SET @@session.time_zone = '-05:00'; SELECT * FROM `employee`;

Bây giờ, hãy thay đổi múi giờ hệ thống từ IST thành EST, tức là UTC – 05:00 trong những tháng lạnh của Giờ tiết kiệm ánh sáng ban ngày.

entry_time 
____________________
2021-07-26 12:19:3

Kết quả ở trên đã thay đổi thành múi giờ đã đặt, tức là EST, là -5 giờ so với giờ UTC.

Mặc dù cả hai kiểu dữ liệu trông giống nhau, nhưng nó khác xa so với những gì chúng ta có thể nghĩ đến. Hy vọng thủ thuật nhỏ này sẽ giúp ích một phần nào đó cho ai đó trong việc phân biệt 2 kiểu dữ liệu khó hiểu này. Vui lòng chia sẻ phản hồi của bạn nếu bạn thấy mẹo này hữu ích cho bạn

Tham khảo thêm MySQL Develope: https://dev.mysql.com/doc/refman/5.7/en/datetime.html
Một số câu hỏi trên stackoverflow: Nên dùng datetime hay timestamp

BÌNH LUẬN

Vui lòng nhập bình luận của bạn
Vui lòng nhập tên của bạn ở đây

9 + 1 =