الانتقال إلى الأداة
ViewCSV
الملفات تبقى على جهازك

تحويل CSV إلى SQL

orders.csv· بيانات نموذجية15 صفًا · 8 أعمدة
الأعمدة المفتاحية
مطلوبة لعبارات ⁦UPSERT⁩ و⁦UPDATE⁩ و⁦DELETE⁩، وتُستخدم مفتاحًا أساسيًا عند إنشاء الجدول.
أنواع القيم
BEGIN;
CREATE TABLE IF NOT EXISTS "orders" (
  "order_id" TEXT,
  "customer" TEXT,
  "city" TEXT,
  "product" TEXT,
  "quantity" TEXT,
  "unit_price" TEXT,
  "order_date" TEXT,
  "status" TEXT
);
INSERT INTO "orders" ("order_id", "customer", "city", "product", "quantity", "unit_price", "order_date", "status") VALUES
  ('001041', 'عمر القحطاني', 'تونس', 'Chair, ergonomic', '6', '144.56', '2026-01-24', 'refunded'),
  ('001042', 'سارة المصري', 'الدوحة', 'Monitor 27"', '9', '161.36', '2026-02-21', 'shipped'),
  ('001043', 'خالد الخطيب', 'عمّان', 'Desk lamp', '5', '170.88', '2026-03-27', 'shipped'),
  ('001044', 'فاطمة الحربي', 'دبي', 'Desk lamp', '1', '161.16', '2026-04-24', 'pending'),
  ('001045', 'نور الزهراني', 'عمّان', 'Notebook A5', '1', NULL, '2026-05-02', 'refunded'),
  ('001046', 'هدى الدوسري', 'الدوحة', 'Monitor 27"', '2', '211.63', '2026-06-17', 'shipped'),
  ('001047', ' علي القحطاني ', 'عمّان', 'Coffee beans 1kg', '2', '57.05', '2026-07-09', 'shipped'),
  ('001048', 'عمر المصري', 'الدار البيضاء', 'Desk lamp', '9', '216.89', '2026-08-13', 'shipped'),
  ('001049', 'أحمد الحربي', 'الرياض', 'USB-C cable', '5', '133.18', '2026-09-01', 'shipped'),
  ('001050', 'يوسف الدوسري', 'عمّان', 'USB-C cable', '4', '242.50', '2026-01-22', 'pending'),
  ('001051', 'أحمد الشمري', 'القاهرة', 'Desk lamp', '2', '217.96', '2026-02-06', 'refunded'),
  ('001052', 'عمر الحسن', 'جدة', 'Desk lamp', '6', '12.86', '2026-03-18', 'shipped'),
  ('001053', 'أحمد السيد', 'دبي', 'USB-C cable', '9', '158.31', '2026-04-13', 'pending'),
  ('001054', 'عمر الدوسري', 'الدار البيضاء', 'Notebook A5', '7', '30.61', '2026-05-07', 'shipped'),
  ('001043', 'خالد الخطيب', 'عمّان', 'Desk lamp', '5', '170.88', '2026-03-27', 'shipped');
COMMIT;

15 صفًا · 1 ملف

بعد فتح ملف CSV أو لصقه واختيار قاعدة البيانات والعبارة يظهر البرنامج بجوار الخيارات. افتراضيًا يكون معاملة PostgreSQL فيها ⁦CREATE TABLE IF NOT EXISTS⁩ بأعمدة TEXT، وعبارات INSERT في كل منها 100 صف، فتبقى ⁦00412⁩ ⁦'00412'⁩. ويُختار اكتشاف الأرقام وقيم ⁦true/false⁩ إذا كان الجدول يحتاج إلى أعمدة رقمية ومنطقية وأعمدة DATE. يُحوَّل الملف في متصفحك ولا يُرفع أبدًا.

طريقة تحويل CSV إلى SQL

  1. افتح ملف ⁦.csv⁩ أو ⁦.tsv⁩ أو ⁦.txt⁩، أو أفلته على الأداة، أو الصق الصفوف. يُكتشف المحدِّد تلقائيًا؛ ويمكن ضبطه أو ضبط صف العناوين أو ترميز قديم مثل ⁦Windows-1252⁩ أو ⁦Windows-1256⁩ من إعدادات الاستيراد.
  2. اختر قاعدة البيانات: PostgreSQL أو MySQL / MariaDB أو SQLite أو SQL Server. وراجع اسم الجدول، الذي يبدأ باسم الملف بعد تحويل المسافات وعلامات الترقيم إلى شرطات سفلية (يصبح ⁦sales report.csv⁩ ⁦sales_report⁩).
  3. اختر العبارة، ومع UPSERT أو UPDATE أو DELETE حدِّد الأعمدة المفتاحية التي تعرّف الصف.
  4. راجع المعاينة، ثم اختر نسخ أو نزّل ملف ⁦.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⁩.

CSV
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
SQL ‏(PostgreSQL)
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 مباشرة.

المعايير والمراجع