سؤال

لدي عمود تم إنشاؤه كـ

`date_start` datetime NOT NULL DEFAULT '1970-01-01'

ومع ذلك ، عندما أقوم بتحميل البيانات من ملف CSV باستخدام أمر بيانات التحميل مع إدخال فارغ لـ date_start القيمة المحفوظة هي 0000-00-00 00:00:00؟

هل كانت مفيدة؟

المحلول

يتيح وضع MySQL SQL افتراضيًا تواريخ صفر.

اعتقادي هو أن أمر التحميل بيانات Infile يقرأ الموضع الفارغ الذي يهدف إلى أن يكون وقتًا ، واستخدام تاريخ صفر تلقائيًا قبل الإدراج. هذا من شأنه أن يفسر سبب عدم تطبيق القيد الافتراضي الخاص بك - القيمة ليست فارغة عند إدراجها.

أعتقد أن لديك خياران:

  1. قم بتحديث جميع الفراغات الموجودة في CSV من "، أو" إلى "، أو خالية" ، أو "، أو" افتراضي "، لذلك سيتم تفسيرها بشكل صحيح
  2. تغيير وضع SQL: SET SQL_MODE='NO_ZERO_DATE'

نصائح أخرى

NULL و "إدخال فارغ" لا يعاملون دائمًا نفس الشيء في MySQL. في حالة datetime نوع البيانات ، يتم تحويل الإدخالات الفارغة تلقائيًا إلى 0000-00-00 00:00:00. يمكنك التفكير في هذا كشكل من أشكال typecasting ، حيث يحصل الفراغ على typecast إلى الصفر.

في ملف البيانات الخاص بك ، حاول استبدال جميع التواريخ الفارغة مع DEFAULT الكلمة الرئيسية.

datetime يعني أن العمود الخاص بك يخزن التاريخ والوقت بالتنسيق Y-m-d H:i:s (0000-00-00 00:00:00).

date يعني أن مخازن العمود الخاصة بك مجرد تاريخ بالتنسيق Y-m-d (0000-00-00).

إذا لم تحدد قيمة عند إدخال البيانات ، يتم استخدام الافتراضي ، ولكن عند إدراج البيانات من ملف CSV ، فإنه يحدد قيمة للحقل ، وبالتالي لا يتم استخدام الافتراضي.

الإدخال الفارغ هو قيمة غير صالحة لحقل DateTime ، وبالتالي فإن القيمة 0000-00-00 00:00:00 يتم استخدامه بدلاً من ذلك ، كما هو الحال مع أي قيمة لا يمكن تحليلها إلى تاريخ صالح (أو تاريخ جزئي).

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

على الرغم من أنه غير موجود ، إلا أنك قد تحاول القيام بالاستيراد والسماح بإدراج تواريخ الصفر غير صالحة ، ثم إصدارها

UPDATE
    table_name
SET
    date_start = '1970-01-01 00:00:00'
WHERE
    date_start = '0000-00-00 00:00:00'
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top