1. MySQL TIMESTAMP คืออะไร?
ชนิดข้อมูล TIMESTAMP
ใน MySQL ใช้สำหรับเก็บเวลาเฉพาะเจาะจงในรูปแบบ UTC (Coordinated Universal Time) โดยจะมีการแปลงโซนเวลาโดยอัตโนมัติเมื่อบันทึกและดึงข้อมูลกลับมา ชนิดข้อมูลนี้สามารถจัดการวันที่และเวลาได้ในช่วงตั้งแต่วันที่ 1 มกราคม 1970 ถึงวันที่ 19 มกราคม 2038 เมื่อบันทึกลงฐานข้อมูล TIMESTAMP
จะใช้โซนเวลาปัจจุบัน และเมื่อดึงข้อมูลออกมาก็จะถูกแปลงกลับตามโซนเวลาของระบบโดยอัตโนมัติ
ความแตกต่างระหว่าง TIMESTAMP และ DATETIME
TIMESTAMP
มักถูกเปรียบเทียบกับชนิดข้อมูล DATETIME
โดย DATETIME
จะเก็บวันที่และเวลาในรูปแบบที่บันทึกไว้โดยตรง โดยไม่ถูกกระทบจากโซนเวลา ขณะที่ TIMESTAMP
จะถูกแปลงเป็น UTC ตอนบันทึก และจะแปลงกลับมาเป็นโซนเวลาของระบบตอนดึงข้อมูล ทำให้ช่วยป้องกันความคลาดเคลื่อนของเวลาได้
ตัวอย่างเช่น TIMESTAMP
เหมาะอย่างยิ่งเมื่อมีการย้ายระบบ หรือจัดการฐานข้อมูลที่อยู่ในหลายโซนเวลา ส่วน DATETIME
รองรับช่วงกว้างกว่าคือ ปี 1000 ถึงปี 9999 จึงมักถูกใช้เพื่อหลีกเลี่ยงปัญหา 2038
ตัวอย่างการใช้ TIMESTAMP
สามารถสร้างตารางที่มี TIMESTAMP
ได้ดังนี้:
CREATE TABLE events (
id INT AUTO_INCREMENT PRIMARY KEY,
event_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
ในตัวอย่างนี้ คอลัมน์ event_time
จะบันทึกเวลาปัจจุบันอัตโนมัติเมื่อมีการเพิ่มข้อมูล และจะอัปเดตใหม่ทุกครั้งเมื่อมีการแก้ไขข้อมูล
2. การใช้งานพื้นฐานของ TIMESTAMP
เมื่อใช้ TIMESTAMP
ใน MySQL สิ่งสำคัญคือการรู้วิธีการเพิ่มและดึงข้อมูลพื้นฐาน ตัวอย่างดังนี้:
การเพิ่มวันที่และเวลา
เมื่อเพิ่มข้อมูลลงใน TIMESTAMP
มักจะใช้รูปแบบสตริง โดยวันที่ใช้รูปแบบ “YYYY-MM-DD” และเวลาใช้รูปแบบ “hh:mm:ss”
INSERT INTO events (event_time) VALUES ('2023-10-01 12:30:00');
คำสั่งนี้จะเพิ่มข้อมูลวันที่ 1 ตุลาคม 2023 เวลา 12:30 ลงในคอลัมน์ event_time
การเพิ่มเวลาปัจจุบัน
สามารถใช้ฟังก์ชัน NOW()
เพื่อดึงเวลาปัจจุบันตามโซนเวลาของระบบ แล้วเพิ่มลงใน TIMESTAMP
INSERT INTO events (event_time) VALUES (NOW());
คำสั่งนี้จะบันทึกเวลาปัจจุบันขณะที่ SQL ถูกเรียกใช้งาน
การใช้ฟีเจอร์อัปเดตอัตโนมัติ
หากระบุ ON UPDATE CURRENT_TIMESTAMP
ในคอลัมน์ TIMESTAMP
เวลาจะถูกบันทึกใหม่ทุกครั้งที่ข้อมูลถูกแก้ไข
CREATE TABLE orders (
id INT AUTO_INCREMENT PRIMARY KEY,
order_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
ในตารางนี้ order_time
จะบันทึกเวลาที่สร้างเรคคอร์ด และจะอัปเดตใหม่เมื่อมีการแก้ไขข้อมูล
3. การจัดการ TIMESTAMP และโซนเวลา
หนึ่งในคุณสมบัติที่สำคัญของ TIMESTAMP
คือการรองรับโซนเวลา ข้อมูลที่บันทึกจะถูกแปลงเป็นรูปแบบ UTC เสมอ และเมื่อดึงข้อมูลออกมาจะถูกแปลงกลับตามโซนเวลาของระบบ
วิธีตรวจสอบการตั้งค่าโซนเวลา
ใน MySQL สามารถตั้งค่าโซนเวลาสำหรับเซิร์ฟเวอร์หรือเซสชันได้ การตรวจสอบสามารถทำได้ด้วยคำสั่ง SHOW VARIABLES
SHOW VARIABLES LIKE 'time_zone';
คำสั่งนี้จะแสดงโซนเวลาที่ใช้งานอยู่ในฐานข้อมูล หากต้องการเปลี่ยนโซนเวลา สามารถใช้คำสั่งดังนี้
SET time_zone = '+09:00';
ความแตกต่างด้านโซนเวลาระหว่าง TIMESTAMP และ DATETIME
DATETIME
จะเก็บวันและเวลาโดยไม่สนใจโซนเวลา ในขณะที่ TIMESTAMP
จะถูกแปลงเป็น UTC ตอนบันทึก ดังนั้นในสภาพแวดล้อมที่มีหลายโซนเวลา TIMESTAMP
จึงเหมาะสมกว่า
4. ปัญหา 2038 และผลกระทบ
ปัญหา 2038 เกิดจากข้อจำกัดของ TIMESTAMP
บนระบบ 32 บิต โดยค่าจะเก็บเป็นจำนวนวินาทีตั้งแต่ 1 มกราคม 1970 และจะล้นเมื่อถึงวันที่ 19 มกราคม 2038 เวลา 03:14:07 UTC
วิธีหลีกเลี่ยงปัญหา 2038
วิธีแก้ไขคือ ใช้ระบบ 64 บิต หรือเปลี่ยนไปใช้ DATETIME
ซึ่งสามารถเก็บค่าตั้งแต่ปี 1000 ถึง 9999 ได้โดยไม่มีข้อจำกัด
การอัปเกรดระบบก็เป็นอีกวิธี เนื่องจาก 64 บิตไม่ประสบปัญหานี้ จึงควรพิจารณาอัปเกรดฐานข้อมูลหรือแอปพลิเคชัน
5. ตัวอย่างการประยุกต์ใช้ TIMESTAMP
TIMESTAMP
ไม่ได้ใช้แค่เก็บวันและเวลาเท่านั้น แต่ยังสามารถใช้ในการบันทึกและอัปเดตเวลาอัตโนมัติ ตัวอย่างเช่น:
การแทรกเวลาปัจจุบันโดยอัตโนมัติ
CREATE TABLE orders (
id INT AUTO_INCREMENT PRIMARY KEY,
order_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
การบันทึกเวลาอัปเดตอัตโนมัติ
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50),
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
การใช้หลายคอลัมน์ TIMESTAMP
CREATE TABLE posts (
id INT AUTO_INCREMENT PRIMARY KEY,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
6. ข้อควรระวังในการใช้ TIMESTAMP
การใช้ TIMESTAMP
มีข้อควรระวัง เช่น ค่า NULL, ค่าเริ่มต้น, และโซนเวลา
ข้อจำกัดเรื่อง NULL และค่าเริ่มต้น
CREATE TABLE logs (
id INT AUTO_INCREMENT PRIMARY KEY,
log_time TIMESTAMP DEFAULT NULL
);
ปัญหา 0000-00-00 00:00:00
แม้ MySQL จะอนุญาตค่า 0000-00-00 00:00:00
แต่ในระบบจริงอาจทำให้เกิดปัญหาความถูกต้องของข้อมูล จึงควรใช้ NULL
แทน
ผลกระทบจากโซนเวลาของระบบ
SET time_zone = 'Asia/Bangkok';
7. สรุปและคำแนะนำ
TIMESTAMP
เป็นเครื่องมือที่มีประสิทธิภาพในการจัดการวันที่และเวลา โดยเฉพาะเมื่อเกี่ยวข้องกับหลายโซนเวลาและการบันทึกการอัปเดตอัตโนมัติ แต่ก็ควรคำนึงถึงปัญหา 2038 และการใช้ค่า NULL
- หากต้องการฟังก์ชันอัปเดตอัตโนมัติ ใช้
TIMESTAMP
- หากระบบเกี่ยวข้องกับหลายโซนเวลา ใช้
TIMESTAMP
- หากต้องการความยืดหยุ่นในอนาคต และต้องใช้ข้อมูลหลังปี 2038 ให้เลือก
DATETIME
8. คำถามที่พบบ่อย (FAQ)
ควรใช้ TIMESTAMP หรือ DATETIME?
TIMESTAMP
เหมาะกับระบบที่เกี่ยวข้องหลายโซนเวลาและต้องการบันทึกเวลาสร้าง/อัปเดตอัตโนมัติ ส่วน DATETIME
เหมาะเมื่อไม่ต้องการให้โซนเวลามีผลกระทบ
จริงหรือไม่ที่ TIMESTAMP ใช้ไม่ได้หลังปี 2038?
ใช่ ปัญหา 2038 เกี่ยวข้องกับ TIMESTAMP
แบบ 32 บิต วิธีแก้คือใช้ระบบ 64 บิต หรือเปลี่ยนเป็น DATETIME
จะอนุญาตค่า NULL ใน TIMESTAMP ได้อย่างไร?
CREATE TABLE logs (
id INT AUTO_INCREMENT PRIMARY KEY,
log_time TIMESTAMP DEFAULT NULL
);
ถ้าเปลี่ยนการตั้งค่าโซนเวลา ข้อมูล TIMESTAMP เดิมจะเปลี่ยนไหม?
ข้อมูลยังถูกเก็บเป็น UTC แต่เมื่อดึงออกมาจะแปลงตามโซนเวลาที่ตั้งค่าใหม่ ดังนั้นการแสดงผลจะเปลี่ยน เพื่อความสอดคล้องควรใช้การตั้งค่าโซนเวลาเดียวกันทั้งระบบ
ใช้ CURRENT_TIMESTAMP จะไม่สามารถใส่เวลาที่ต้องการเองได้หรือ?
CURRENT_TIMESTAMP
จะบันทึกเวลาปัจจุบันอัตโนมัติ แต่หากต้องการใส่วันที่/เวลาที่ระบุเอง ก็สามารถใช้ NOW()
หรือค่าที่เป็นสตริงได้
INSERT INTO events (event_time) VALUES ('2023-10-01 12:30:00');