بعد فتح ملف CSV أو لصقه واختيار قاعدة البيانات والعبارة يظهر البرنامج بجوار الخيارات. افتراضيًا يكون معاملة PostgreSQL فيها CREATE TABLE IF NOT EXISTS بأعمدة TEXT، وعبارات INSERT في كل منها 100 صف، فتبقى 00412 '00412'. ويُختار اكتشاف الأرقام وقيم true/false إذا كان الجدول يحتاج إلى أعمدة رقمية ومنطقية وأعمدة DATE. يُحوَّل الملف في متصفحك ولا يُرفع أبدًا.
طريقة تحويل CSV إلى SQL
- افتح ملف
.csv أو .tsv أو .txt، أو أفلته على الأداة، أو الصق الصفوف. يُكتشف المحدِّد تلقائيًا؛ ويمكن ضبطه أو ضبط صف العناوين أو ترميز قديم مثل Windows-1252 أو Windows-1256 من إعدادات الاستيراد. - اختر قاعدة البيانات: PostgreSQL أو MySQL / MariaDB أو SQLite أو SQL Server. وراجع اسم الجدول، الذي يبدأ باسم الملف بعد تحويل المسافات وعلامات الترقيم إلى شرطات سفلية (يصبح
sales report.csv sales_report). - اختر العبارة، ومع UPSERT أو UPDATE أو DELETE حدِّد الأعمدة المفتاحية التي تعرّف الصف.
- راجع المعاينة، ثم اختر نسخ أو نزّل ملف
.sql وشغّله بعميل قاعدة البيانات، مثل psql -f data.sql.
لإنشاء برامج لملفات كثيرة بالإعدادات نفسها، اختر دفعة واحدة: تحويل عدة ملفات. يُحوَّل كل ملف بدوره، وتُنزَّل البرامج معًا في ملف ZIP واحد.
العبارات والخيارات
| INSERT | عبارات INSERT INTO … VALUES متعددة الصفوف. يحدد عدد الصفوف في كل INSERT عدد الصفوف التي تشترك في عبارة واحدة (من 1 إلى 1000، والافتراضي 100)؛ ويرفض SQL Server أكثر من ألف. |
|---|---|
| UPSERT (إدراج أو تحديث) | عبارة لكل صف تُدرجه أو تحدّث الصف الموجود الذي له المفتاح نفسه: ON CONFLICT (…) DO UPDATE SET … = excluded.… في PostgreSQL وSQLite، وON DUPLICATE KEY UPDATE في MySQL، وMERGE في SQL Server. ويحتاج الجدول المستهدف إلى مفتاح أساسي أو فهرس فريد على الأعمدة المفتاحية. |
| UPDATE | UPDATE … SET … WHERE key = … لكل صف؛ ولا تتغير الأعمدة المفتاحية. وإذا كانت كل الأعمدة مفتاحية فلا شيء يُحدَّث ولا تُكتب أي عبارة. |
| DELETE | DELETE FROM … WHERE key = … لكل صف. وتصبح قيمة المفتاح الفارغة IS NULL. |
| الأعمدة المفتاحية | مطلوبة لعبارات UPSERT وUPDATE وDELETE؛ ولا تكتب الأداة أيًا منها دون مفتاح WHERE. ومع إضافة CREATE TABLE تصبح الأعمدة المفتاحية NOT NULL وPRIMARY KEY. |
| إضافة CREATE TABLE | مفعّل افتراضيًا. يكتب CREATE TABLE IF NOT EXISTS (أو CREATE TABLE العادية في SQL Server أو بعد DROP). |
| إضافة DROP TABLE IF EXISTS أولًا | يستبدل جدولًا موجودًا بالاسم نفسه. معطّل افتراضيًا؛ ويضيع الجدول القديم وبياناته عند تشغيل البرنامج. |
| التضمين في معاملة (transaction) | مفعّل افتراضيًا: BEGIN; … COMMIT; (START TRANSACTION; في MySQL، وBEGIN TRANSACTION; في SQL Server). |
| كتابة الخلايا الفارغة بقيمة NULL | مفعّل افتراضيًا. ويُعطَّل لكتابة الخلايا الفارغة بصيغة '' بدلًا من ذلك. |
أنواع الأعمدة والاقتباس
مع إبقاء كل القيم نصًا (الافتراضي) يكون كل عمود TEXT (NVARCHAR(MAX) في SQL Server)، وكل قيمة سلسلة نصية حرفية مقتبسة، فتُحمَّل الأصفار في البداية والمعرّفات الطويلة والتواريخ غير المألوفة دون تغيير.
ومع اكتشاف الأرقام وقيم true/false لا يحصل العمود على نوع إلا إذا ناسبته كل قيمه غير الفارغة:
| الأعداد الصحيحة | INTEGER، أو BIGINT إذا كانت في قيمة ما أكثر من 9 خانات. وتُكتب القيم دون علامات اقتباس. والأرقام التي تبدأ بأصفار أو تتجاوز 9,007,199,254,740,991 تُبقي العمود نصًا. |
|---|---|
| الأعداد العشرية (15 رقمًا معنويًا على الأكثر) | NUMERIC في PostgreSQL، وDECIMAL(p,s) بحجم يُحدَّد من البيانات في MySQL وSQL Server، وREAL في SQLite. والفاصلة العشرية مثل 1,5 تُبقي العمود نصًا. |
| true / false (بأي حالة أحرف) | يصبح العمود من نوع BOOLEAN بالقيمتين TRUE/FALSE في قاعدتي PostgreSQL وMySQL، ومن نوع BIT بالقيمتين 1/0 في SQL Server، ومن نوع INTEGER بالقيمتين 1/0 في SQLite. |
| التواريخ بصيغة YYYY-MM-DD | DATE مع قيم مقتبسة مثل '2026-03-01'؛ وTEXT في SQLite. وتبقى التواريخ مع الوقت وتنسيقات التاريخ الأخرى نصًا. |
- تُقتبس أسماء الجداول والأعمدة كما كُتبت تمامًا، فتعمل المسافات والكلمات المحجوزة والأسماء غير اللاتينية، ومنها العربية:
"order date" في PostgreSQL وSQLite، و`order date في MySQL، و[order date]` في SQL Server. وتُضاعَف أحرف الاقتباس الداخلة في الاسم. - في القيم تُضاعَف علامة الاقتباس المفردة (تصبح
O'Brien 'O''Brien'). وفي MySQL تُضاعَف الشرطات المائلة العكسية أيضًا، لأن MySQL يعامل \ رمز تهريب افتراضيًا. وتحصل القيم الحرفية في SQL Server على البادئة N فيُحفظ نص Unicode. - تبقى فواصل الأسطر داخل قيمة CSV المقتبسة داخل السلسلة النصية الحرفية في SQL.
- لا تستطيع أغلب قواعد البيانات تخزين أحرف NUL؛ لذا تُحذف وتذكر الأداة عددها.
حل المشكلات
- البرنامج كله عمود واحد. خُمِّن المحدِّد خطأً؛ اضبطه من إعدادات الاستيراد وافتح الملف من جديد.
- خرج عمود أرقام بنوع TEXT. قيمة واحدة على الأقل ليست رقمًا بسيطًا، مثل
12 kg أو 1,5 أو 007. ابحث عنها في عارض CSV أو أصلِح العمود بأداة تنظيف CSV. - تفشل عبارة UPSERT بسبب قيد مفقود. لا تعمل
ON CONFLICT وON DUPLICATE KEY إلا إذا كان للجدول المستهدف مفتاح أساسي أو فهرس فريد على الأعمدة المفتاحية. أضِف الفهرس إلى الجدول الموجود، أو دع إضافة CREATE TABLE تنشئ المفتاح. - يرفض MySQL أو SQL Server المفتاح الأساسي PRIMARY KEY. العمود المفتاحي الذي يبقى نصًا يُنشأ بنوع
TEXT (MySQL/MariaDB) أو NVARCHAR(MAX) (SQL Server)، ولا تستطيع أي من القاعدتين فهرسة هذين النوعين بالكامل. أنشئ الجدول بنفسك بمفتاح VARCHAR، ثم عطّل إضافة CREATE TABLE. - يبلّغ SQL Server بأن الجدول موجود مسبقًا. تستخدم برامج SQL Server عبارة
CREATE TABLE العادية. عطّل إضافة CREATE TABLE للتحميل في الجدول الموجود، أو فعّل إضافة DROP TABLE IF EXISTS أولًا لاستبداله. - يتوقف البرنامج في منتصفه. تذكر رسالة الخطأ من قاعدة البيانات العبارة التي فشلت؛ والأسباب المعتادة مفتاح مكرر أو قيمة لا تناسب نوع عمود في جدول موجود. افحص الملف بأداة التحقق من CSV وشغّل البرنامج من جديد.
الملفات الكبيرة والحدود
الملفات حتى 25 ميغابايت أو 100 ألف صف أو مليوني خلية تُفتح مع معاينة مباشرة. أما الملفات الأكبر فتُحوَّل تدفقيًا: تعرض المعاينة أول 200 صف، ويُقرأ الملف مرتين على أجزاء (مرة لمعرفة أنواع الأعمدة وعروضها، ومرة لكتابة البرنامج)، ويشمل الملف المنزَّل كل الصفوف. والحد الأقصى للبرنامج الواحد 4 غيغابايت.
يجري التحويل في عامل خلفي داخل علامة التبويب هذه، فتبقى الصفحة مستجيبة ويوقفه زر إلغاء. ولا يُرسل ملف CSV أبدًا إلى أي خادم. وللحصول على ملف قاعدة بيانات جاهز بدل البرنامج، استخدم CSV إلى SQLite.
مثال
قائمة عملاء فيها معرّف يبدأ بصفر، واسم فيه فاصلة عليا وفاصلة، وخطة فارغة، حُوّلت بالإعدادات الافتراضية واسم الجدول customers. ومع اكتشاف الأرقام وقيم true/false يصبح signup_date DATE، وmonthly_fee NUMERIC بالقيمة 29.00 دون اقتباس، وactive BOOLEAN مع TRUE/FALSE، بينما يبقى customer_id TEXT.
customer_id,name,signup_date,plan,monthly_fee,active 00412,"O'Brien, Kate",2026-03-01,pro,29.00,true 00413,Luis Ortega,2026-03-04,,0,false
BEGIN;
CREATE TABLE IF NOT EXISTS "customers" (
"customer_id" TEXT,
"name" TEXT,
"signup_date" TEXT,
"plan" TEXT,
"monthly_fee" TEXT,
"active" TEXT
);
INSERT INTO "customers" ("customer_id", "name", "signup_date", "plan", "monthly_fee", "active") VALUES
('00412', 'O''Brien, Kate', '2026-03-01', 'pro', '29.00', 'true'),
('00413', 'Luis Ortega', '2026-03-04', NULL, '0', 'false');
COMMIT;أسئلة وأجوبة
لماذا تكون كل الأعمدة TEXT افتراضيًا؟
لا أنواع في CSV، والتخمين الخاطئ يضيّع البيانات: معرّف مثل 00412 يُخزَّن عددًا صحيحًا يصبح 412. أما النص فيحمّل ما في الملف تمامًا. واختر اكتشاف الأرقام وقيم true/false إذا أردت أعمدة رقمية ومنطقية وأعمدة DATE.
أي قواعد البيانات يمكنها تشغيل البرنامج؟
PostgreSQL، وMySQL وMariaDB، وSQLite، وSQL Server، ولكل منها طريقتها في اقتباس المعرّفات وتهريب السلاسل النصية والقيم المنطقية وصيغة UPSERT. اختر قاعدة البيانات المطابقة قبل التنزيل؛ فالبرنامج المكتوب لإحداها لا يصلح للأخرى.
هل يمكنه إنشاء أوامر COPY أو LOAD DATA بدل INSERT؟
لا. يستخدم البرنامج عبارات INSERT أو UPSERT أو UPDATE أو DELETE القياسية. وللتحميلات الكبيرة جدًا، يمكن التفكير في أداة التحميل المجمّع الخاصة بقاعدة بياناتك، مثل COPY في PostgreSQL أو LOAD DATA في MySQL، لقراءة ملف CSV مباشرة.