SQLite Database
ملف SQLite قاعدة بيانات علائقية كاملة في ملف واحد — بدون خادم، بدون تثبيت، بدون إعدادات. هاتفك يحتوي عشرات منها الآن: الرسائل، جهات الاتصال، سجلّ المتصفّح، ذاكرة كل تطبيق. أكثر من تريليون نسخة نشطة حول العالم — أكثر من كل محركات قواعد البيانات مجتمعةً.
تحويل SQLite غير متاح حالياً في FileDex. استخدم أوامر CLI في المرجع التقني أدناه للتصدير أو التحويل بين صيغ قواعد البيانات عبر sqlite3 أو DB Browser.
أسئلة شائعة
ما الفرق بين امتداد .sqlite و .db؟
كلا الامتدادين يحتويان على التنسيق نفسه — أوّل 16 بايت دائماً `SQLite format 3\0`. الفرق إعلانيّ فقط. تطبيقات تستخدم `.sqlite` أو `.sqlite3` تُعلن صراحةً عن محرّكها؛ تطبيقات تستخدم `.db` أو `.db3` تبقى عامّة؛ ملف History في Chrome لا يستخدم أي امتداد. المحرّك نفسه لا يهتمّ — البشر وأدوات التحليل فقط يهتمّون.
كيف أفتح ملف .sqlite؟
استخدم الأمر `sqlite3` من سطر الأوامر (مُثبَّت مسبقاً على macOS وLinux). على Windows حمِّل ملف sqlite3.exe من موقع sqlite.org أو استخدم أداة DB Browser — الواجهة الرسومية المجّانية. للعرض السريع اسحب الملف إلى نافذة الأداة. للعمل البرمجي شغّل أمر `sqlite3 file.db` ثم الأمر `.tables` لرؤية الجداول. ثم استعلام `SELECT` أساسي لقراءة أوّل الصفوف.
ما وضع WAL وما هو ملف -wal؟
وضع WAL يُتيح قراءات متزامنة مع الكتابات. عند تفعيله بأمر `PRAGMA` المناسب، SQLite يُنشئ ملفاً مرافقاً ينتهي بـ `-wal` يحمل الصفحات غير المدمَجة. حذف هذا الملف يُفقد أي معاملات لم تُدمج بعد. للنسخ الآمن استخدم الأمر `sqlite3 source.db '.backup dest.db'` الذي يدمج بيانات WAL تلقائياً قبل الكتابة.
هل يمكن استرجاع صفوف محذوفة من قاعدة بيانات SQLite؟
نعم جزئياً. الإصدار 3.29.0 وما بعده يتضمّن الأمر `.recover` الذي يتجاوز بنية الشجرة الثنائية ويمسح الصفحات الخام بحثاً عن سجلات قابلة للاستخراج — بما في ذلك صفوف حُذفت لكنّ محتواها لا يزال في صفحات القائمة الحرّة. الأمر `sqlite3 source.db '.recover' | sqlite3 recovered.db` يُنتج قاعدة بيانات جديدة تحمل كلّ ما لا يزال قابلاً للقراءة في الأصل.
كيف تستخدم تطبيقات أبشر وSTC Pay تقنية SQLite؟
تطبيقات الجوّال السعودية الكبرى (أبشر، STC Pay، Tamara، جاهز، HungerStation) تستخدم SQLite للتخزين المحلّي والعمل دون اتّصال. تُحفَظ فيها رموز الجلسات، البيانات المؤقّتة للنماذج، والمعاملات الأخيرة قبل المزامنة مع الخوادم. التصميم الذي لا يحتاج خادماً والتشغيل عبر جميع الأنظمة يجعل SQLite الاختيار الافتراضي للتقنية المالية في المنطقة التي تتعرّض أحياناً لانقطاعات في الاتّصال. القواعد تعيش عادةً داخل مجلّد بيانات التطبيق على Android.
ما يميز .SQLITE
قاعدة بيانات كاملة في ملف واحد. هذه الجملة تلخّص SQLite كلّها. لا خادم يعمل في الخلفية، لا مستخدم قاعدة بيانات، لا إعدادات شبكة، لا مسؤول نظام. افتح الملف، اكتب، أغلقه. هذا البساطة الجذرية هي السبب الذي جعل SQLite أكثر محرّك قواعد بيانات انتشاراً في التاريخ.
اكتشف التفاصيل التقنية
الامتداد يمكن أن يكون أيّ شيء تختاره. ماذا يعني ذلك عن التنسيق؟
افتح مدير الملفات على جهازك واستعرض تطبيقات سعودية. ستجد عشرات من ملفات قواعد البيانات، لكنّ أسماءها مختلفة. places.sqlite في Thunderbird. app.db في تطبيق لإدارة الديون. chat.db في iMessage. ملف اسمه History بدون أيّ امتداد على الإطلاق في Chrome.
كلّها تبدأ بـ 16 بايتاً نفسها عند الإزاحة 0: 53 51 4C 69 74 65 20 66 6F 72 6D 61 74 20 33 00 — نصّ ASCII يُقرأ "SQLite format 3" متبوعاً ببايتٍ صفري. المحرّك لا يهتمّ بالاسم الذي اختاره المطوِّر. نظام التشغيل لا يهتمّ كذلك. المهتمّون الوحيدون هم البشر — والمحلّلون الجنائيّون.
التمييز مهمّ في التحقيقات الرقمية. محقِّق يفحص مجلّد تطبيقات على هاتف محمول يستطيع تحديد ملفات .sqlite بسرعة؛ بينما ملفات .db العامّة تحتاج فحصاً داخلياً للتمييز بين SQLite وBerkeley DB وLevelDB وغيرها. تطبيقات تريد بياناتها قابلة للفحص تختار .sqlite صراحةً. تطبيقات بنوك تُفضّل عدم إعلان محرّكها تختار .db عامّاً أو تحذف الامتداد تماماً.
الامتداد بالتالي ليس مطلباً تقنياً — هو إعلان عن نيّة المطوِّر. اختيار .sqlite3 يقول للعالم "هذه قاعدة بيانات SQLite، تعامل معها". اختيار .db يقول "تعامل معها كصندوق أسود". المحقِّقون يعرفون هذا. يتجاوزون الامتداد ويقرؤون البايتات مباشرة.
المحلِّلون الجنائيّون يقرؤون أوّل 100 بايت قبل أيّ شيء آخر. لماذا هذه البايتات بالذات؟
كلّ تحقيق يبدأ بأوّل 100 بايت. الستّ عشرة الأولى هي التوقيع السحري. البايتات الـ 84 المتبقّية تحمل ملخّصاً كاملاً عن الملف قبل أن يحتاج المحلّل فتحه.
الإزاحة 0x10 تحمل حجم الصفحة — عدد صحيح من بايتين يجب أن يكون من قوى الرقم 2 بين 512 و65536. الإفتراضي 4096 بايت. الإزاحة 0x12 تحمل إصدار تنسيق الكتابة: القيمة 1 تعني وضع "Rollback Journal" التقليدي، والقيمة 2 تعني وضع "Write-Ahead Logging" الحديث. الإزاحة 0x13 تحمل إصدار تنسيق القراءة المُطابق. ثلاث بايتات تكشف الحالة الأساسية للقاعدة.
عدّاد تغيير الملف عند الإزاحة 0x18 يتزايد مع كلّ معاملة كتابة — يسمح للتطبيقات بمعرفة ما إذا كانت القاعدة قد تغيّرت منذ آخر قراءة. "schema cookie" عند 0x28 يتزايد مع كلّ تعديل في بنية الجداول. ترميز النصّ عند 0x38 (القيمة 1 تعني UTF-8، 2 تعني UTF-16 صغير النهاية، 3 تعني UTF-16 كبير النهاية) يُحدِّد كيف تُقرأ النصوص داخل الصفوف.
الإزاحة 0x60 هي الأجمل: أربع بايتات تُخزِّن رقم إصدار المكتبة التي كتبت الملف آخر مرّة، بتنسيق عشري مُعبَّأ. القيمة 00 38 12 00 تُقرأ 3.39.0. المحلّلون يستطيعون إعطاء بصمة كاملة لأي ملف — إصدار المكتبة، حجم الصفحة، وضع التسجيل — دون فتحه أبداً. الترويسة تكشف ما في الملف. الملفات المرافقة بجانبه تكشف ما لم يُثبَّت بعد.
انسخ ملف SQLite بدون المرافق. لقد فقدت للتوّ معاملات مُثبَّتة. لماذا؟
افتح قاعدة بيانات SQLite حديثة وسترى ملفاً ثانياً يظهر بجانبها. database.db هو الأصل. database.db-wal هو سجلّ الكتابة المسبقة. database.db-shm هو مؤشّر في الذاكرة المشتركة تستخدمه عدّة عمليات عند الوصول المتزامن.
احذف ملف -wal بينما يحمل بيانات لم تُدمج بعد، وستفقد تلك التغييرات للأبد. هذا الخطر هو العقبة الكبرى في التحليل الجنائي للهواتف المحمولة.
قبل 2010 كانت SQLite تستخدم "Rollback Journal" فقط — تكتب نسخ الصفحات القديمة إلى ملف منفصل قبل تعديل القاعدة الأصلية. إذا انهار النظام أثناء الكتابة، المحرّك يقرأ الملف ويُعيد الصفحات القديمة. النظام يعمل، لكنّه يمنع القراءة أثناء الكتابة.
وضع WAL أُضيف في الإصدار 3.7.0 يوليو 2010. الاسم الكامل للوضع Write-Ahead Logging. بدل نسخ الصفحات القديمة، WAL يُلحق الصفحات الجديدة إلى ملف منفصل ويدمجها لاحقاً في "نقطة تحقّق". الفائدة: القرّاء لا يتأثّرون بوجود كاتب نشط.
هذا يخلق مشكلة في التحقيق الجنائي. ملف msgstore.db الخاصّ بواتساب يحمل الرسائل القديمة؛ ملف msgstore.db-wal يحمل الرسائل الجديدة التي لم تُدمج بعد. محقّق يستخدم أمر cp لنسخ القاعدة الرئيسية فقط يفقد الرسائل الأحدث — أحياناً أياماً من المحادثات. النسخ الآمن يستخدم الأمر sqlite3 source.db '.backup destination.db' الذي يعبر عبر محرّك SQLite نفسه، ويدمج بيانات WAL المعلَّقة قبل الكتابة. سلوك WAL تفصيل هندسي. الحجم الذي يعمل به هو الجزء المذهل.
تريليون نسخة نشطة من SQLite. كيف وصلت إلى هذا الرقم؟
هاتفك يحمل الآن عشرات قواعد بيانات SQLite. رسائل واتساب في msgstore.db.crypt14. رسائل Apple في chat.db. تطبيقات المراسلة الكبرى جميعها تستخدم SQLite. سجلّ Chrome في ملف اسمه History. places.sqlite في Firefox. History.db في Safari.
التطبيقات السعودية الاستهلاكية الرئيسية — بينها أبشر وSTC Pay وجاهز — تُخزِّن البيانات في SQLite للعمل بدون اتّصال بالإنترنت. عندما يُفتح التطبيق في منطقة ضعيفة التغطية، البيانات تعمل محلياً من قاعدة SQLite. عند استعادة الاتّصال، التطبيق يُزامن مع خوادمه.
نظام Android يُشحن SQLite كمكوِّن إطاري أساسي. نظام iOS يستخدم إطاراً اسمه Core Data. هذا الإطار يعمل فوق SQLite. تطبيقات Mail وSafari في macOS تستخدمها داخلياً. كلّ تثبيت Windows 10 أو 11 يحتوي قواعد بيانات SQLite لميزات النظام.
مشروع sqlite.org يُقدِّر أكثر من تريليون نسخة نشطة حول العالم — أكثر من كلّ محرّكات قواعد البيانات الأخرى مجتمعةً بأضعاف. سير عمل التحليل الجنائي للهواتف يبدأ دائماً بـ SQLite. يستخرج المحقِّق مجلّد قواعد البيانات من الجهاز. يفتح كلّ ملف بواسطة أمر sqlite3 أو أداة DB Browser. ثم يُشغِّل الأمر .recover لاسترجاع الصفوف المحذوفة من صفحات القائمة الحرّة. معظم الناس يحملون 50-100 قاعدة بيانات SQLite في جيوبهم كلّ يوم دون أن يعلموا.
مقارنة .SQLITE مع البدائل
| المقارنة | المعيار | الفائز |
|---|---|---|
| .SQLITE vs .MYSQL | نموذج النشر SQLite ملف واحد لا يحتاج شيئاً — لا خادم، لا تركيب، لا إعدادات. افتح الملف، اكتب، أغلقه. MySQL في المقابل يحتاج عملية خادم تعمل دائماً في الخلفية، وحسابات مستخدمين، وإعدادات شبكة، ومسؤول قاعدة بيانات يُراقب الأداء. لمعظم التطبيقات الصغيرة والمتوسّطة، SQLite يحذف طبقة كاملة من التعقيد. | SQLITE أفضل |
| .SQLITE vs .MYSQL | الكتابات المتزامنة MySQL يستطيع التعامل مع آلاف اتّصالات الكتابة في الوقت نفسه عبر قفل على مستوى الصفّ الواحد. SQLite يُرتِّب كلّ الكتابات عبر قفل واحد على مستوى الملف كلّه. لتطبيق يستقبل كتابات متزامنة عالية الحجم، MySQL يفوز بوضوح. لقراءات كثيرة مع كتابات قليلة، SQLite كافٍ تماماً. | MYSQL أفضل |
| .SQLITE vs .POSTGRESQL | اكتمال ميزات SQL PostgreSQL يدعم ميزات متقدّمة تغيب عن SQLite: FULL OUTER JOIN، إجراءات مخزَّنة بلغة PL/pgSQL، أنواع بيانات مُخصَّصة، وامتدادات شاملة مثل PostGIS للبيانات الجغرافية. SQLite يركِّز على الأساسيات — استعلامات، فهارس، جداول. للمشاريع التي تحتاج ميزات SQL كاملة، PostgreSQL أفضل. | POSTGRESQL أفضل |
| .SQLITE vs .ملف JSON | قدرة الاستعلام SQLite يدعم استعلامات SQL كاملة مع JOIN والتجميع ودوال النافذة والفهارس — كلّ ذلك في ملف واحد. ملفّات JSON تتطلّب تحميلاً كاملاً في الذاكرة والمرور على كلّ السجلات لكلّ استعلام. لبيانات تزيد عن عدّة آلاف من الصفوف، SQLite أسرع بأضعاف. | SQLITE أفضل |
المرجع التقني
- نوع MIME
application/vnd.sqlite3- Magic Bytes
53 51 4C 69 74 65 20 66 6F 72 6D 61 74 20 33 00SQLite format 3\0 text signature.- المطوّر
- D. Richard Hipp
- سنة التقديم
- 2000
- معيار مفتوح
- نعم — عرض المواصفات
SQLite format 3\0 text signature.
البنية الثنائية
ملف SQLite ثنائي يبدأ بترويسة طولها 100 بايت. الستّ عشرة بايت الأولى هي السلسلة النصّية `SQLite format 3\0` — التوقيع المُستخدم في فهرس PRONOM الرسمي (fmt/729). الـ 84 بايت المتبقّية تحمل بيانات بنيوية أساسية: حجم الصفحة (الإزاحة 0x10)، إصدار تنسيق الكتابة والقراءة (0x12-0x13، القيمة 1 تعني Rollback Journal والقيمة 2 تعني WAL)، عدّاد تغيير الملف (0x18)، مؤشّر تعديل بنية الجداول (0x28)، ترميز النصّ (0x38، القيمة 1 تعني UTF-8)، ورقم إصدار مكتبة SQLite التي كتبت الملف آخر مرّة (0x60، بتنسيق عشري معبَّأ). بعد الترويسة يُقسَّم الملف إلى صفحات ثابتة الحجم تحتوي صفحات الشجرة الثنائية، الفهارس، وصفحات الفيض للسجلات الأكبر من صفحة واحدة.
| Offset | Length | Field | Example | Description |
|---|---|---|---|---|
0x00 | 16 bytes | السلسلة السحرية | 53 51 4C 69 74 65 20 66 6F 72 6D 61 74 20 33 00 | السلسلة النصّية `SQLite format 3\0` — تُحدِّد الملف كقاعدة بيانات SQLite، وهي أطول توقيع بين تنسيقات الملفّات الشائعة |
0x10 | 2 bytes | حجم الصفحة | 10 00 (4096) | حجم الصفحة داخل الملف بالبايت. يجب أن يكون قوّة من الرقم 2 بين 512 و65536. القيمة 4096 هي الافتراضية في معظم الأنظمة الحديثة |
0x12 | 1 byte | إصدار تنسيق الكتابة | 01 | القيمة 1 تعني وضع Rollback Journal التقليدي. القيمة 2 تعني وضع Write-Ahead Logging الحديث الذي يسمح بالقراءات المتزامنة مع الكتابة |
0x13 | 1 byte | إصدار تنسيق القراءة | 01 | نفس الترميز لإصدار الكتابة: القيمة 1 تعني Rollback Journal، القيمة 2 تعني وضع WAL. يجب أن تتطابق مع إصدار الكتابة في الملفات الصحيحة |
0x14 | 1 byte | مساحة محجوزة | 00 | عدد البايتات غير المستخدمة في نهاية كلّ صفحة — عادةً 0. يُستخدم أحياناً لإضافات خاصّة بتطبيقات معيَّنة |
0x18 | 4 bytes | عدّاد تغيير الملف | 00 00 00 2A | يتزايد مع كلّ معاملة كتابة. يُستخدم للتحقّق من صلاحية ذاكرة التخزين المؤقَّت — العملاء الذين يحتفظون ببيانات مؤقّتة يقارنون قيمتهم بالقيمة الحالية |
0x1C | 4 bytes | حجم القاعدة بالصفحات | 00 00 00 08 | العدد الإجمالي للصفحات في ملف قاعدة البيانات. ضرب هذا الرقم في حجم الصفحة يُعطي الحجم الكامل للملف بالبايت |
0x20 | 4 bytes | أوّل صفحة جذع في القائمة الحرّة | 00 00 00 00 | رقم أوّل صفحة في القائمة الحرّة — الصفحات التي حُذفت محتوياتها وأصبحت متاحة لإعادة الاستخدام. القيمة 0 تعني لا توجد صفحات حرّة |
0x24 | 4 bytes | عدد صفحات القائمة الحرّة | 00 00 00 00 | العدد الإجمالي للصفحات في القائمة الحرّة المتاحة لإعادة الاستخدام. تتزايد مع حذف السجلات وتنقص مع الإدخالات الجديدة |
0x28 | 4 bytes | ملفّ تعريف المخطَّط | 00 00 00 05 | يتزايد مع كلّ تعديل في بنية الجداول (CREATE، DROP، ALTER). يُشغِّل إعادة ترجمة العبارات المُعدَّة مسبقاً في التطبيقات |
0x2C | 4 bytes | إصدار تنسيق المخطَّط | 00 00 00 04 | رقم إصدار تنسيق المخطَّط الداخلي — القيمة الحالية 4 منذ SQLite 3.3.0. تُحدِّد الميزات المدعومة في تخزين الجداول والفهارس |
0x34 | 4 bytes | حجم ذاكرة التخزين المقترح | 00 00 00 00 | الحجم الافتراضي لذاكرة التخزين المؤقَّت للصفحات، المقترح عبر الأمر PRAGMA default_cache_size. مجرّد اقتراح — التطبيقات يمكنها تجاوزه |
0x38 | 4 bytes | ترميز النصّ | 00 00 00 01 | يُحدِّد ترميز النصوص داخل قاعدة البيانات: القيمة 1 تعني UTF-8، القيمة 2 تعني UTF-16 صغير النهاية، القيمة 3 تعني UTF-16 كبير النهاية |
0x3C | 4 bytes | إصدار المستخدم | 00 00 00 00 | رقم إصدار مخصَّص للتطبيق، يُضبط عبر PRAGMA user_version. تستخدمه التطبيقات لتعقُّب إصدارات المخطَّط وإجراء عمليات الترحيل |
0x60 | 4 bytes | رقم إصدار SQLite | 00 38 12 00 (3.39.0) | رقم إصدار مكتبة SQLite التي كتبت الملف آخر مرّة، بتنسيق عشري معبَّأ. يُستخدم في التحليل الجنائي لمعرفة إصدار الكاتب الأخير |
تحويل SQLite غير متاح حالياً في FileDex. استخدم أوامر CLI في المرجع التقني أدناه للتصدير أو التحويل بين صيغ قواعد البيانات عبر sqlite3 أو DB Browser.
نقاط الضعف
- حقن SQL عبر كود التطبيق
- ملفات قواعد بيانات خبيثة (CVE-2019-8457 Magellan)
- استخراج البيانات من الأجهزة المحمولة
- هجوم ATTACH DATABASE للوصول إلى نظام الملفات
الحماية: افتح ملفات SQLite من مصادر موثوقة فقط. افحص ترويسة الملف الثنائية قبل التحليل الكامل عند التعامل مع قواعد بيانات غير موثوقة. استخدم الأمر `PRAGMA integrity_check` للكشف عن الفساد أو التلاعب في المخطَّط. لا تُحمِّل ملفات SQLite تطبيقية عبر الشبكة دون تشفير. FileDex لا يحلل ملفات SQLite — هذه الصفحة مرجع ثابت، لا رفع ملف.