Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

ประเภทข้อมูล MySQL DATETIME และ TIMESTAMP แตกต่างกันอย่างไร


ทั้งประเภทข้อมูลจัดเก็บข้อมูลในรูปแบบ “YYYY-MM-DD HH:MM:SS” และรวมวันที่และเวลา แม้ว่าจะมีความคล้ายคลึงกัน แต่ก็มีความแตกต่างดังต่อไปนี้ -

  • ช่วง − ประเภทข้อมูล Datetime รองรับวันที่พร้อมกับเวลาในช่วงระหว่าง 1000-01-01 00:00:00 และ 9999-12-31 23:59:59 แต่ประเภทข้อมูลการประทับเวลารองรับวันที่พร้อมกับเวลาในช่วงระหว่าง '1970-01-01 00:00:01' ถึง '2038-01-19 08:44:07'
  • ขนาด − Datetime ต้องการ 5 ไบต์พร้อมกับ 3 ไบต์เพิ่มเติมสำหรับการจัดเก็บข้อมูลเศษเสี้ยววินาที ในทางกลับกัน ประเภทข้อมูลการประทับเวลาต้องใช้ 4 ไบต์พร้อมกับ 3 ไบต์เพิ่มเติมสำหรับการจัดเก็บข้อมูลเศษเสี้ยววินาที แต่ก่อน MySQL 5.6.4 DateTime ต้องการ 8 ไบต์และ 3 ไบต์เพิ่มเติมสำหรับการจัดเก็บข้อมูลเศษเสี้ยววินาที
  • แปลงจากเขตเวลาหนึ่งเป็นเขตเวลาอื่น − ที่จริงแล้วใน MySQL5+ ค่าการประทับเวลาจะแปลงจากเวลาปัจจุบันเป็น UTC และในทางกลับกัน ในขณะที่ datetime ไม่ได้ทำการแปลงใดๆ
  • การจัดทำดัชนี − การทำดัชนีสามารถทำได้บนข้อมูลการประทับเวลา แต่ไม่สามารถจัดทำดัชนีข้อมูลวันที่และเวลาได้
  • การแคชข้อความค้นหา - การสืบค้นที่มีประเภทข้อมูลประทับเวลาสามารถแคชได้ แต่การสืบค้นที่มีประเภทข้อมูลเวลาวันที่และเวลาไม่สามารถแคชได้

ข้างต้นคือความแตกต่างที่สำคัญระหว่างประเภทข้อมูล DATETIME และ TIMESTAMP และตัวอย่างต่อไปนี้จะแสดงให้เห็น -

ตัวอย่าง

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)

ในแบบสอบถามต่อไปนี้ เราได้เปลี่ยนเขตเวลาเป็น UTC-05:00 และผลลัพธ์ถูกเปลี่ยนสำหรับตารางที่มีประเภทข้อมูล 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)

ผลลัพธ์

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