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

SQLite / الأساسي: المحرك المضمّن والبيانات الصحيحة / الدرس 2

فئات التخزين والألفة وجداول STRICT

اختر تمثيل SQLite وفق معنى المجال، وميّز تحويل الألفة المرن من الضمانات الأقوى لجداول STRICT.

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

أهداف الدرس

  • شرح فئة تخزين القيمة وألفة العمود.
  • استخدام STRICT بأنواعها المدعومة.
  • تمثيل المال والتاريخ والمنطق والمعرف بقصد.

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

تستخدم القيم فئات NULL و INTEGER و REAL و TEXT و BLOB. يحدد نوع العمود المعلن في الجدول العادي عادة ألفته: تفضيلاً لتحويل المتوافق، لا منعاً شاملاً لتخزين غيره. تفحص typeof() القيمة المخزنة، ولذلك قد يحتوي عمود معلن INTEGER نصاً لم يمكن تحويله وفق قواعد الألفة المعتادة.

تفيد المرونة تطبيقات معينة لكنها قد تخفي عقد إدخال مكسوراً. لا يثبت نجاح INSERT أن الكمية عدد صالح أو أن المعرف بقي نصاً. تحقق من معنى المصدر وافحص قيماً ممثلة؛ فالألفة تؤثر أيضاً في المقارنة والفرز، وقد يتجاوز أثر التخزين المختلط عملية الإدراج الأولى.

راقب التحويل بدلاً من تخمينه

يدرج المثال عدداً ونصاً عددياً ونصاً غير عددي في عمود ألفته INTEGER. يصبح النص 123 عدداً صحيحاً، وتبقى pear نصاً. يوضح ذلك لماذا لا يكفي النوع المعلن للتحقق في جدول SQLite عادي. تجعل المعرفات والترتيب الملاحظة قابلة للتكرار.

تحدد الألفة قواعد أسماء أنواع موثقة، لا قائمة أنواع صارمة من محرك آخر. تمنح DECIMAL عادة ألفة NUMERIC ولا تنشئ حساباً عشرياً ثابتاً أو تفرض المنازل. ولا تفرض VARCHAR(20) وحدها طول عشرين محرفاً. استخدم التمثيل المناسب و CHECK بدلاً من نقل افتراضات محرك آخر.

sql فحص تحويل الألفة العادي
CREATE TABLE flexible(id INTEGER PRIMARY KEY, value INTEGER);
INSERT INTO flexible VALUES(1,7),(2,'123'),(3,'pear');
SELECT id,value,typeof(value) AS storage FROM flexible ORDER BY id;
الناتج المتوقع
id|value|storage
1|7|integer
2|123|integer
3|pear|text

يحول النص العددي ويبقى الرمز غير العددي TEXT؛ فلا يرفضه هنا قيد مجال.

استخدم STRICT لحد أنواع مقصود

ظهرت جداول STRICT في SQLite 3.37.0، وتقبل الأسماء INT و INTEGER و REAL و TEXT و BLOB و ANY. يجب أن توافق القيمة القواعد الأقوى بعد التحويل المسموح دون فقد؛ فليست STRICT منعاً لكل تحويل. يحفظ ANY في جدول STRICT تمثيل التخزين المقدم عندما يكون الحفاظ عليه مطلوباً.

يحفظ المثال 003 نصاً ويحول الكمية 12 الصحيحة إلى عدد. تفشل الكمية غير العددية بدلاً من تخزينها نصاً اعتباطياً. لا تفرض STRICT الإيجابية أو صلاحية التاريخ أو التفويض أو الوحدة؛ فتلك عقود إضافية. ولا تستطيع بيئة أقدم تجاهل الكلمة عند قراءة المخطط أو إنشائه.

sql حفظ تسمية مع فرض نوع الكمية
CREATE TABLE precise(id INTEGER PRIMARY KEY, code TEXT NOT NULL,
 quantity INTEGER NOT NULL, raw ANY) STRICT;
INSERT INTO precise VALUES(1,'003','12','003');
SELECT code,quantity,typeof(quantity) AS quantity_type,raw,typeof(raw) AS raw_type
FROM precise ORDER BY id;
الناتج المتوقع
code|quantity|quantity_type|raw|raw_type
003|12|integer|003|text

يبقى الرمز و ANY بالنص 003، وتصبح الكمية العدد 12 بتحويل مسموح.

اختر الوحدات والدقة صراحة

قد تجنب الوحدات النقدية الصغرى الصحيحة تقريب العائم للمال الدقيق المحدود، بشرط توثيق العملة والمقياس والمدى وموضع التقريب. تناسب REAL قياسات تقريبية كثيرة ولا تمثل مالاً عشرياً دقيقاً. وقد يتجاوز INTEGER المدى، فيجب فحص المدخل والحساب في اللغة المضيفة أيضاً.

لا توجد فئة تخزين مستقلة للتاريخ أو المنطق. يمكن تمثيل الوقت بنص ISO معرف أو REAL ليوم يولياني أو INTEGER لزمن Unix وفق العقد. يحتاج المنطقي المطلوب NOT NULL و CHECK(value IN (0,1)). تبقى المنطقة الزمنية والعملة ضروريتين رغم صحة فئة التخزين.

احفظ دلالة النص والغياب

يحفظ TEXT النص، لكن التطبيع والمقارنة يحتاجان سياسة. تعالج NOCASE المضمّنة أساساً حالة ASCII ولا توفر مقارنة لغوية شاملة لـ Unicode. اختبر العربية والأسماء المعلمة ورموز المنتجات الحساسة وفق قواعدها المقصودة، وحدد وحدة فحص الطول والتعامل مع المحارف غير المعتادة.

تعني NULL غياب معلومة لا صفراً أو تسمية فارغة. لا يغني CHECK الذي ينتج NULL عن NOT NULL. وثق حالات الغياب واختبر الفراغ والصفر والمعرف الشبيه بالعدد والتالف والحدود. يجعل التصميم الصحيح المرونة اختياراً صريحاً لا مدخلاً عرضياً لبيانات متناقضة.

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

ظهر نص غير عددي في الكمية.

لماذا يحدث؟
عوملت الألفة كتحقق صارم.
كيف تصلحه؟
تحقق من الإدخال واختر STRICT والقيود المناسبة.
كيف تتجنب تكراره؟
اختبر typeof() والرموز التالفة.

unknown datatype for a STRICT column

لماذا يحدث؟
استُخدم VARCHAR أو DECIMAL في تعريف STRICT.
كيف تصلحه؟
اختر نوعاً مدعوماً وعرّف المجال مستقلاً.
كيف تتجنب تكراره؟
افحص الإصدار وأسماء الأنواع.

ظهرت كسور غير متوقعة في المال.

لماذا يحدث؟
افتُرض أن REAL أو NUMERIC حساب عشري دقيق.
كيف تصلحه؟
استخدم مقياساً صحيحاً موثقاً أو تصميماً عشرياً مناسباً.
كيف تتجنب تكراره؟
اختبر التقريب والمدى.

اختبر فهمك

1. لماذا يكون المعرف 003 عادة TEXT رغم إمكان تحليله إلى INTEGER؟

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

تنتمي الأصفار البادئة إلى الهوية وقد لا يكون للحساب على الرمز معنى. احفظه نصاً وافحص صيغة التسمية بدلاً من إسقاط هويتها. أما الكمية فمفهوم مختلف يحتاج نوعه ومداه ووحدته؛ ولا يثبت تشابه المظهر أن الحقلين يجب أن يشتركا في تمثيل عددي.

2. هل تضمن STRICT INTEGER وحدها كمية مطلوبة موجبة؟

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

لا؛ أضف قابلية الغياب وقاعدة القيمة المطلوبتين، مثل NOT NULL و CHECK(quantity>0). تتحكم STRICT في توافق التخزين وتعبر القيود الإضافية عن المجال. اختبر NULL والصفر والسالب والقيمة الصحيحة والزائدة، كيلا تتحول سلامة النوع إلى افتراض بصحة كل قيمة تجارية.

أهم ما تعلمته

  • تنتمي فئة التخزين للقيمة وتؤثر الألفة في التحويل.
  • لـ STRICT حد إصدار وأسماء أنواع محددة.
  • لا يعوض النوع الوحدة والدقة والغياب وقاعدة المجال.

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