1. ما هو TIMESTAMP في MySQL؟
في MySQL، يقوم نوع البيانات TIMESTAMP بتخزين نقطة زمنية محددة في UTC (التوقيت العالمي المنسق) ويتم تعديلها تلقائيًا لمنطقة التوقيت أثناء التخزين والاسترجاع. يمكن لهذا النوع من البيانات التعامل مع التواريخ والأوقات من 1 يناير 1970 إلى 19 يناير 2038. عند تخزين البيانات، يستخدم TIMESTAMP منطقة التوقيت الحالية، وعند الاسترجاع، يتم تحويلها تلقائيًا مرة أخرى بناءً على منطقة التوقيت للنظام.
الفرق بين TIMESTAMP و DATETIME
غالبًا ما يُقارن نوع البيانات DATETIME بنوع TIMESTAMP. بخلاف TIMESTAMP، يقوم 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.
إدراج تاريخ ووقت محدد
عند إدراج البيانات في عمود TIMESTAMP، عادةً ما تقدم التاريخ والوقت كسلسلة نصية بالتنسيق YYYY-MM-DD hh:mm:ss.
INSERT INTO events (event_time) VALUES ('2023-10-01 12:30:00');
هذا البيان SQL يدرج 1 أكتوبر 2023 الساعة 12:30 مساءً في العمود event_time.
إدراج الوقت الحالي
باستخدام دالة NOW() في MySQL، يمكنك بسهولة إدراج التاريخ والوقت الحاليين. تعيد هذه الدالة الوقت الحالي للنظام بناءً على منطقة التوقيت المُعدة.
INSERT INTO events (event_time) VALUES (NOW());
في هذه الحالة، يدرج الاستعلام الطابع الزمني الحالي الدقيق في اللحظة التي يتم فيها تشغيل SQL.
تمكين التحديثات التلقائية
بإضافة ON UPDATE CURRENT_TIMESTAMP إلى عمود TIMESTAMP، يقوم MySQL تلقائيًا بتحديث قيمة العمود كلما تم تعديل السجل.
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 LIKE 'time_zone';
للتغيير في منطقة التوقيت، يمكنك استخدام:
SET time_zone = '+09:00';
TIMESTAMP مقابل DATETIME في مناطق التوقيت
يتجاهل DATETIME مناطق التوقيت ويخزن القيم بالضبط كما تم إدخالها، بينما يحول TIMESTAMP إلى UTC. هذا يجعل TIMESTAMP أكثر ملاءمة للأنظمة التي تعمل عبر مناطق توقيت متعددة.
4. مشكلة عام 2038
تنشأ مشكلة عام 2038 من قيود الأنظمة 32 بت مع TIMESTAMP. بما أنها تحسب الثواني من 1 يناير 1970، فإنها تتجاوز بعد 19 يناير 2038 الساعة 03:14:07 UTC.
كيفية تجنب مشكلة 2038
لتجنب ذلك، استخدم نظامًا 64 بت أو انتقل إلى DATETIME، الذي يدعم السنوات من 1000 إلى 9999. ترقيات النظام إلى 64 بت تقضي أيضًا على المشكلة بالكامل.
5. الاستخدامات العملية لـ TIMESTAMP
MySQL’s 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 متعددة
على الرغم من أنه يمكنك وجود أعمدة TIMESTAMP متعددة في جدول، إلا أن واحدة فقط يمكن أن تكون لها CURRENT_TIMESTAMP كقيمة افتراضية. للحقول الزمنية المتعددة المدارة تلقائيًا، قد تحتاج إلى استخدام DATETIME أو تعيين قيم صراحةً.
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
قيود NULL وقيم الافتراضية
أعمدة TIMESTAMP هي NOT NULL افتراضيًا. للسماح بقيم NULL، حدد DEFAULT 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 أو قيمة افتراضية صالحة.
تأثير منطقة الوقت النظامية
لأن TIMESTAMP يخزن دائمًا UTC، فإن نقل قواعد البيانات عبر خوادم بمناطق وقت مختلفة يمكن أن يؤثر على النتائج. تأكد دائمًا من إدارة منطقة الوقت بشكل متسق.
7. الملخص والتوصيات
TIMESTAMP أداة قوية في MySQL لإدارة التواريخ والأوقات بكفاءة. ميزات التحويل التلقائي مع مناطق الوقت والتحديث التلقائي تجعلها مريحة للغاية. ومع ذلك، يجب على المطورين فهم قيودها مثل مشكلة عام 2038 ومعالجة NULL.
- استخدم
TIMESTAMPعندما تكون التحديثات التلقائية مطلوبة. - اختر
TIMESTAMPللأنظمة الحساسة لمناطق الوقت. - استخدم
DATETIMEللبيانات طويلة الأمد بعد 2038 أو عند الحاجة إلى التوافق المطلق.
8. الأسئلة الشائعة (FAQ)
متى يجب أن أستخدم TIMESTAMP مقابل DATETIME؟
استخدم TIMESTAMP للأنظمة التي تحتاج تعديلات منطقة الوقت وتسجيل أوقات الإنشاء/التحديث تلقائيًا. استخدم DATETIME عندما تريد تخزينًا متسقًا غير متأثر بمناطق الوقت.
هل صحيح أن TIMESTAMP لن يعمل بعد 2038؟
نعم، في الأنظمة 32-بت، يحدث تجاوز لـ TIMESTAMP بعد 19 يناير 2038. لمنع المشاكل، استخدم DATETIME أو انتقل إلى نظام 64-بت.
كيف أسمح بقيم NULL في عمود TIMESTAMP؟
حدد DEFAULT NULL صراحةً عند إنشاء العمود:
CREATE TABLE logs (
id INT AUTO_INCREMENT PRIMARY KEY,
log_time TIMESTAMP DEFAULT NULL
);
هل تغيير منطقة الوقت يؤثر على بيانات TIMESTAMP الموجودة؟
البيانات المخزنة تبقى في UTC، لكن الاسترجاع يعدل إلى إعداد منطقة الوقت الجديد، مما يغير كيفية عرض الأوقات. حافظ على مناطق الوقت النظامية متسقة لتجنب الالتباس.
هل يمكنني إدراج وقت محدد إذا استخدمت CURRENT_TIMESTAMP؟
نعم. بينما CURRENT_TIMESTAMP يدرج الوقت النظامي الحالي، يمكنك لا تزال إدراج قيم محددة يدويًا:
INSERT INTO events (event_time) VALUES ('2023-10-01 12:30:00');


