محتويات الدورة

MariaDB / الأساسي: الأسس العلاقية / الدرس 2

المخططات والقيم الدقيقة والنصوص متعددة اللغات

صمم جدول مستودع صغيراً تعبر أنواعه عن معنى البيانات، وافهم أثر NULL والوضع الصارم والترتيب اللغوي في التخزين والمقارنة.

وقت القراءة التقريبي: 4 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • اختيار أنواع عددية وزمنية مناسبة.
  • شرح مجموعات المحارف والترتيب اللغوي والقيم المفقودة.

الأنواع جزء من قاعدة العمل

ابدأ بالحقائق لا بمظهر العينة: معرف الطرد مفتاح، والسعر عدد عشري دقيق، والاسم نص. يسمح DECIMAL(9,2) بسبعة أرقام صحيحة ورقمين كسريين، ولذلك يناسب مثال المال أكثر من الفاصلة العائمة. يقاس طول VARCHAR بالمحارف، بينما يعتمد التخزين أيضاً على مجموعة المحارف. أبقِ الرمز البريدي نصاً إذا كانت الأصفار الأولى والحروف ذات معنى.

صرح بعقد البيانات بوضوح

يفترض التعريف قاعدة تدريب فارغة اسمها harbor_lab ولا يوجه إلى تجهيز خادم إنتاج. نصرح بـ InnoDB وutf8mb4 حتى لا تغير الإعدادات الافتراضية الضمانات. الترتيب اللغوي المختار واسع التوافر، وقد تحتاج اللغة أو قواعد المعرفات ترتيباً آخر بعد التحقق. يرفض CHECK الأسعار السالبة في الإصدارات الحديثة المدعومة؛ أما ما قبل 10.2.1 فكان يقبل الصياغة دون فرضها، وهو فرق مهم عند الترحيل.

sql SQL توضيحي؛ النتائج المتوقعة مستنتجة وليست قياسات.
CREATE TABLE harbor_lab.parcels (
  parcel_id INT PRIMARY KEY,
  label VARCHAR(80) NOT NULL,
  price DECIMAL(9,2) NOT NULL CHECK (price >= 0),
  delivered_at DATETIME NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
  COLLATE=utf8mb4_unicode_ci;

يحدد المفتاح الأساسي الصف، ويسمح delivered_at بوقت غير معلوم. لإنشاء الكائنات آثار على المعاملات تناقش لاحقاً.

المفقود يختلف عن الصفر

تمثل NULL قيمة غائبة أو مجهولة وليست سلسلة فارغة أو تاريخاً صفرياً. اختبرها بـ IS NULL لأن المساواة العادية معها تعطي نتيجة مجهولة. حدد هل الزمن لحظة عالمية أم وقت محلي. لا ينفذ DATETIME تحويل المنطقة الزمنية المرتبط بـ TIMESTAMP. تختلف الدقة والمجالات حسب النوع والإصدار. اعتمد اتفاقاً واضحاً على UTC عند ملاءمته، واحفظ المنطقة الأصلية منفصلة إذا احتاجها العمل.

افحص القيم المخزنة والمقارنات

إذا لم يوجد سوى الصفين المضافين، يعيد الاستعلام الطرد 1 بسعر 12.30. للقيمة العشرية معنى عددي حتى لو عرض العميل الصفر الأخير بطريقة مختلفة. يُستبعد الطرد الثاني لأن وقت تسليمه معلوم. تحتاج العربية إلى مجموعة محارف مناسبة للاتصال والعمود معاً؛ لا يصلح تعريف الجدول بايتات أفسدها عميل سيئ الإعداد. يكشف SHOW CREATE TABLE التعريف الفعلي.

sql SQL توضيحي؛ النتائج المتوقعة مستنتجة وليست قياسات.
INSERT INTO harbor_lab.parcels VALUES
 (1, 'صندوق', 12.30, NULL),
 (2, 'Envelope', 4.00, '2026-10-01 09:00:00');
SELECT parcel_id, price FROM harbor_lab.parcels
WHERE delivered_at IS NULL ORDER BY parcel_id;
الناتج المتوقع
parcel_id | price
1         | 12.30

النتيجة المنطقية المتوقعة وفق عينة الصفين المحددة.

تحقق قبل قبول التحويلات

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

الأخطاء الشائعة وإصلاحها

ERROR 1366: Incorrect string value

لماذا يحدث؟
ترميز الاتصال أو العمود لا يمثل النص الوارد.
كيف تصلحه؟
افحص مجموعتي المحارف وترميز الاستيراد ثم أرسل النص الأصلي السليم.
كيف تتجنب تكراره؟
حدد utf8mb4 عبر المسار كاملاً واختبر حفظ العربية واستعادتها.

تختفي الصفوف غير المسلمة من التصفية

لماذا يحدث؟
استخدم الشرط delivered_at = NULL.
كيف تصلحه؟
استخدم delivered_at IS NULL للقيم المفقودة.
كيف تتجنب تكراره؟
ضمّن قيماً مفقودة وفارغة وموجودة في الأمثلة.

يُقرب السعر أو يُقص دون انتباه

لماذا يحدث؟
سمح نوع غير مناسب أو وضع متساهل بالتحويل.
كيف تصلحه؟
اختر دقة DECIMAL كافية وافحص تحذيرات التحويل.
كيف تتجنب تكراره؟
حدد الحدود العددية وتوقعات الوضع الصارم قبل الاستيراد.

اختبر فهمك

1. قد تصل رسوم التسليم إلى 1234567.89. هل يكفي DECIMAL(9,2)، وهل يكفي DECIMAL(8,2)؟

اعرض الحل المشروح

يكفي DECIMAL(9,2) لأنه يسمح بسبعة أرقام صحيحة واثنين كسريين. أما DECIMAL(8,2) فيسمح بستة أرقام صحيحة فقط فلا يستوعب القيمة. اختر حداً أكبر موثقاً إذا كان النمو محتملاً؛ ولا تحول إلى FLOAT لحل متطلب المال الدقيق.

2. أضف اسماً عربياً للعرض دون اعتباره معرفاً تجارياً. ما الفحوص التي تثبت الصحة؟

اعرض الحل المشروح

أبقِ parcel_id مفتاحاً، وتحقق من اتصال utf8mb4، وأدخل نصاً عربياً معلوماً في المختبر ثم قارن المحارف المسترجعة بالأصل. افحص ترتيب الجدول الفعلي واختبر سلوك الحالة أو العلامات منفصلاً. نجاح الإدخال وحده لا يثبت فك الترميز أو التفرد التجاري.

أهم ما تعلمته

  • الأنواع وقواعد NULL والترتيب اللغوي عقد بيانات واحد.
  • افحص التعريفات الفعلية والتحذيرات بدلاً من الثقة بالإعدادات الافتراضية.

المراجع الرسمية