php - باستخدام MySQL's TIMESTAMP مقابل تخزين الطوابع الزمنية مباشرة




datetime unsigned-integer (2)

أنا في مأزق حول توفير قيم التاريخ والوقت في تنسيق TIMESTAMP في MySQL مقابل بتنسيق INSIGNED INT مخصص. الاعتبارات الرئيسية هنا هي سرعة الاسترجاع وحسابات النطاق المناسبة في PHP والتنسيق العرضي في القيم القابلة للقراءة البشرية.

مساحة التخزين المطلوبة لكل نوع ونطاقاتها:

DATETIME        8 bytes  '1000-01-01 00:00:00' to '9999-12-31 23:59:59'
TIMESTAMP       4 bytes  '1970-01-01 00:00:01' UTC to '2038-01-19 03:14:07' UTC
UNSIGNED INT    4 bytes  (Maximum Value 4294967295)

لا أحتاج إلى نطاق التاريخ على الإطلاق. أنا ممزقة بين TIMESTAMP و INSIGNED INT.

الحجج المؤيدة لـ INTIGNED INT:

  • يتم تحويل الطابع الزمني UNIX الخاص بـ 4294967295 إلى Sun ، 07 Feb 2106 06:28:15 GMT وهو أكثر من TIMESTAMP وجيد بما يكفي بالنسبة لي
  • ستكون مقارنة هذه الطوابع الزمنية مباشرة في PHP أسرع بدلاً من تحويل TIMESTAMPs عبر strtotime () ثم مقارنتها

الميزة الوحيدة التي قد تعطيني TIMESTAMP هي عندما أقوم بقراءة القيم من جدول mysql يدويًا وتحتاج إلى "رؤيتها".

هل هناك أي سبب مقنع لاستخدام TIMESTAMP وليس INT Signed INT؟


الاستخدام الحقيقي الوحيد لـ TIMESTAMP هو عندما ترغب في تحديث هذا الحقل تلقائيًا عند تحديث الصف (وهو السلوك الافتراضي لهذا الحقل) ، أو عندما تكون متطلبات تخزين البيانات صارمة للغاية بحيث يؤدي وجود 4 بايت لكل صف إلى اختلاف حقيقي في أنت.

يجب أن تكون المقارنة بين DATETIME و INSIGNED INT ، وأوصي DATETIME بسبب:

  • يمكنك استخدام وظائف التاريخ / الوقت الأصلية في MySQL لاختيار النطاقات الزمنية وما إلى ذلك.
  • من السهل جدًا تحديد هذه التواريخ خارجًا باعتبارها طوابع زمنية لـ UNIX لسهولة التنسيق في PHP: SELECT UNIX_TIMESTAMP(field) FROM table ، لا حاجة لتحديد القيمة الأولية واستخدام وقت التشغيل
  • أسهل في قراءة وتحرير الحقول في قاعدة البيانات الخاصة بك مباشرة إذا كنت بحاجة إلى (كما أشرت).
  • لا قيود على نطاق التاريخ

النقطة الثانية وحدها تزيل حقا أي سبب للتخزين في أعداد صحيحة ، في رأيي.


قد لا تكون هذه إجابة "علمية" ، لكنني دائمًا ما أجد الطريقة التي يتعامل بها MySql مع التحويل ، وعلم الحساب ، والترجمة ، إلخ ... على أعمدة TIMESTAMP المربكة. يعد عمود INSIGNED INT أكثر مباشرة للأمام وأعلم دائمًا ما يجب توقعه.

ملاحظة: ربما يكون هناك شيء آخر لصالح عمود TIMESTAMP وهو قدرته على التعيين تلقائيًا على الوقت الحالي بعد كل تحديث أو إدخال ، لكن هذا ليس شيئًا لا يمكنك العيش بدونه.







unsigned-integer