MySQL "DateTime Not Null Default '1970-01-01' '
-
01-10-2019 - |
سؤال
لدي عمود تم إنشاؤه كـ
`date_start` datetime NOT NULL DEFAULT '1970-01-01'
ومع ذلك ، عندما أقوم بتحميل البيانات من ملف CSV باستخدام أمر بيانات التحميل مع إدخال فارغ لـ date_start
القيمة المحفوظة هي 0000-00-00 00:00:00؟
المحلول
يتيح وضع MySQL SQL افتراضيًا تواريخ صفر.
اعتقادي هو أن أمر التحميل بيانات Infile يقرأ الموضع الفارغ الذي يهدف إلى أن يكون وقتًا ، واستخدام تاريخ صفر تلقائيًا قبل الإدراج. هذا من شأنه أن يفسر سبب عدم تطبيق القيد الافتراضي الخاص بك - القيمة ليست فارغة عند إدراجها.
أعتقد أن لديك خياران:
- قم بتحديث جميع الفراغات الموجودة في CSV من "، أو" إلى "، أو خالية" ، أو "، أو" افتراضي "، لذلك سيتم تفسيرها بشكل صحيح
- تغيير وضع 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'