أنواع البيانات في SQL (Data Types)

أنواع البيانات في SQL (Data Types) هي أساس تصميم قواعد البيانات الاحترافية. تحدد أنواع البيانات في SQL نوع القيم التي يمكن تخزينها في كل عمود من أعمدة الجدول، وتؤثر بشكل مباشر على أداء قاعدة البيانات، استهلاك المساحة التخزينية، ودقة البيانات. في هذا الدرس الشامل من سلسلة تعلم لغة SQL باللغة العربية، سنتعلم جميع أنواع البيانات في SQL مثل INT, VARCHAR, TEXT, DATE, DECIMAL وكيفية اختيار النوع المناسب لكل حالة استخدام لضمان أداء عالي وتصميم قاعدة بيانات محترف.

1. ما هي أنواع البيانات في SQL؟

أنواع البيانات في SQL (Data Types) تحدد نوع القيم التي يمكن تخزينها في عمود معين من الجدول. عند إنشاء جدول في SQL، يجب تحديد نوع البيانات لكل عمود، وهذا يساعد قاعدة البيانات على:

  • التحقق من صحة البيانات: منع إدخال بيانات غير صحيحة (مثل إدخال نص في عمود رقمي)
  • تحسين الأداء: تخزين البيانات بطريقة فعالة واستخدام الفهارس بشكل أفضل
  • توفير المساحة: استخدام المساحة التخزينية المناسبة لكل نوع بيانات
  • تسهيل العمليات: تنفيذ العمليات الحسابية والمقارنات بشكل صحيح
تصنيف أنواع البيانات في SQL
التصنيف الوصف أمثلة
أنواع رقمية لتخزين الأرقام الصحيحة والعشرية INT, DECIMAL, FLOAT
أنواع نصية لتخزين النصوص والأحرف VARCHAR, TEXT, CHAR
أنواع التاريخ والوقت لتخزين التواريخ والأوقات DATE, TIME, DATETIME
أنواع منطقية لتخزين القيم المنطقية BOOLEAN
أنواع خاصة لتخزين بيانات خاصة JSON, BLOB, ENUM

2. الأنواع الرقمية (Numeric Types)

الأنواع الرقمية في SQL تُستخدم لتخزين الأرقام الصحيحة والعشرية. اختيار النوع الرقمي المناسب مهم جداً لتوفير المساحة وتحسين الأداء.

أ- الأرقام الصحيحة (Integer Types)
أنواع الأرقام الصحيحة في SQL
-- TINYINT: أرقام صغيرة جداً (-128 إلى 127)
age TINYINT

-- SMALLINT: أرقام صغيرة (-32,768 إلى 32,767)
quantity SMALLINT

-- INT أو INTEGER: الأكثر استخداماً (-2 مليار إلى 2 مليار تقريباً)
user_id INT

-- BIGINT: أرقام كبيرة جداً
population BIGINT
ب- الأرقام العشرية (Decimal Types)
أنواع الأرقام العشرية في SQL
-- DECIMAL(p, s): دقيق جداً للمبالغ المالية
-- p = إجمالي الأرقام، s = الأرقام بعد الفاصلة
price DECIMAL(10, 2)  -- مثال: 12345678.99

-- FLOAT: رقم عشري تقريبي (دقة منخفضة)
temperature FLOAT

-- DOUBLE: رقم عشري تقريبي (دقة مزدوجة)
scientific_value DOUBLE
تحذير مهم:

لا تستخدم FLOAT أو DOUBLE للمبالغ المالية! استخدم دائماً DECIMAL لتجنب أخطاء التقريب.

3. الأنواع النصية (String Types)

الأنواع النصية في SQL تُستخدم لتخزين النصوص والأحرف. الاختيار بين VARCHAR و TEXT يعتمد على طول النص المتوقع.

أ- CHAR و VARCHAR
الفرق بين CHAR و VARCHAR في SQL
-- CHAR(n): طول ثابت - يملأ المساحة الفارغة بمسافات
country_code CHAR(2)  -- 'SA', 'US', 'UK'

-- VARCHAR(n): طول متغير - يستخدم المساحة الفعلية فقط
username VARCHAR(50)
email VARCHAR(100)
address VARCHAR(255)
الخاصية CHAR VARCHAR
الطول ثابت متغير
المساحة المستخدمة دائماً n بايت حسب الطول الفعلي + 1-2 بايت
الأداء أسرع قليلاً أكثر كفاءة في المساحة
الاستخدام الأمثل بيانات ثابتة الطول (رموز الدول) بيانات متغيرة الطول (الأسماء، العناوين)
ب- TEXT Types
أنواع TEXT في SQL
-- TEXT: نصوص طويلة (حتى 65,535 حرف)
description TEXT
bio TEXT

-- MEDIUMTEXT: نصوص أطول (حتى 16 مليون حرف)
article_content MEDIUMTEXT

-- LONGTEXT: نصوص ضخمة جداً (حتى 4 جيجابايت)
full_book LONGTEXT

4. أنواع التاريخ والوقت (Date and Time Types)

أنواع التاريخ والوقت في SQL تُستخدم لتخزين التواريخ والأوقات بطريقة منظمة، مما يسمح بإجراء عمليات حسابية ومقارنات زمنية.

أنواع التاريخ والوقت في SQL
-- DATE: تاريخ فقط (YYYY-MM-DD)
birth_date DATE  -- مثال: '1990-05-15'

-- TIME: وقت فقط (HH:MM:SS)
start_time TIME  -- مثال: '14:30:00'

-- DATETIME: تاريخ ووقت معاً
created_at DATETIME  -- مثال: '2024-02-02 14:30:00'

-- TIMESTAMP: مثل DATETIME لكن مع تحديث تلقائي
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

-- YEAR: سنة فقط
graduation_year YEAR  -- مثال: 2024
النوع الصيغة المدى الاستخدام
DATE YYYY-MM-DD 1000-01-01 إلى 9999-12-31 تاريخ الميلاد، تاريخ الانضمام
TIME HH:MM:SS -838:59:59 إلى 838:59:59 ساعات العمل، مدة زمنية
DATETIME YYYY-MM-DD HH:MM:SS 1000-01-01 إلى 9999-12-31 وقت الإنشاء، آخر تسجيل دخول
TIMESTAMP YYYY-MM-DD HH:MM:SS 1970-01-01 إلى 2038-01-19 تتبع التعديلات التلقائية

5. النوع المنطقي (Boolean Type)

النوع المنطقي في SQL يُستخدم لتخزين القيم المنطقية: صحيح (TRUE) أو خطأ (FALSE).

استخدام BOOLEAN في SQL
-- في MySQL، BOOLEAN هو اختصار لـ TINYINT(1)
is_active BOOLEAN  -- 0 = FALSE, 1 = TRUE
is_verified BOOLEAN
has_discount BOOLEAN

-- أمثلة على الاستخدام
INSERT INTO users (username, is_active) VALUES ('ahmed', TRUE);
INSERT INTO users (username, is_active) VALUES ('fatima', 1);  -- نفس النتيجة

-- البحث
SELECT * FROM users WHERE is_active = TRUE;
SELECT * FROM users WHERE is_verified;  -- اختصار لـ = TRUE

6. أنواع خاصة (Special Types)

أ- ENUM - قائمة قيم محددة
استخدام ENUM في SQL
-- ENUM: اختيار من قائمة محددة
status ENUM('pending', 'processing', 'completed', 'cancelled')
gender ENUM('male', 'female')
priority ENUM('low', 'medium', 'high')

-- مثال كامل
CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    customer_name VARCHAR(100),
    status ENUM('pending', 'processing', 'shipped', 'delivered') DEFAULT 'pending'
);
ب- JSON - تخزين بيانات JSON
استخدام JSON في SQL
-- JSON: تخزين بيانات منظمة بصيغة JSON
settings JSON
metadata JSON

-- مثال
CREATE TABLE products (
    product_id INT PRIMARY KEY,
    name VARCHAR(100),
    specifications JSON
);

INSERT INTO products VALUES (
    1,
    'Laptop',
    '{"brand": "Dell", "ram": "16GB", "storage": "512GB SSD"}'
);

7. مثال عملي شامل: إنشاء جدول متكامل

لنطبق ما تعلمناه عن أنواع البيانات في SQL بإنشاء جدول متكامل لنظام إدارة متجر إلكتروني:

جدول متكامل باستخدام أنواع البيانات المختلفة
CREATE TABLE users (
    -- أرقام صحيحة
    user_id INT PRIMARY KEY AUTO_INCREMENT,
    age TINYINT,
    
    -- نصوص
    username VARCHAR(50) NOT NULL UNIQUE,
    email VARCHAR(100) NOT NULL UNIQUE,
    first_name VARCHAR(50),
    last_name VARCHAR(50),
    bio TEXT,
    
    -- أرقام عشرية
    balance DECIMAL(10, 2) DEFAULT 0.00,
    
    -- تاريخ ووقت
    birth_date DATE,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    last_login TIMESTAMP,
    
    -- منطقي
    is_active BOOLEAN DEFAULT TRUE,
    is_verified BOOLEAN DEFAULT FALSE,
    
    -- ENUM
    account_type ENUM('free', 'premium', 'enterprise') DEFAULT 'free',
    
    -- JSON
    preferences JSON
);

-- إدراج بيانات تجريبية
INSERT INTO users (
    username, 
    email, 
    first_name, 
    last_name, 
    age, 
    balance, 
    birth_date,
    account_type,
    preferences
) VALUES (
    'ahmed_ali',
    'ahmed@example.com',
    'أحمد',
    'علي',
    28,
    1500.50,
    '1995-03-15',
    'premium',
    '{"language": "ar", "theme": "dark", "notifications": true}'
);
عرض البيانات
SELECT 
    user_id,
    CONCAT(first_name, ' ', last_name) AS full_name,
    email,
    age,
    balance,
    YEAR(CURRENT_DATE) - YEAR(birth_date) AS calculated_age,
    account_type,
    is_active,
    created_at
FROM users;

8. كيف تختار نوع البيانات المناسب؟

قواعد ذهبية لاختيار نوع البيانات:
  1. استخدم أصغر نوع ممكن: اختر النوع الذي يستوعب بياناتك بأقل مساحة
  2. للمبالغ المالية: استخدم دائماً DECIMAL وليس FLOAT
  3. للنصوص القصيرة: استخدم VARCHAR مع تحديد الطول المناسب
  4. للنصوص الطويلة: استخدم TEXT أو MEDIUMTEXT
  5. للتواريخ: استخدم DATE أو DATETIME وليس VARCHAR
  6. للقيم المحددة: استخدم ENUM بدلاً من VARCHAR
نوع البيانات ✅ استخدم عندما ❌ لا تستخدم عندما
INT أرقام صحيحة (معرفات، كميات) أرقام عشرية، نصوص
DECIMAL مبالغ مالية، نسب دقيقة قياسات تقريبية
VARCHAR نصوص متغيرة الطول (أسماء، عناوين) نصوص طويلة جداً
TEXT محتوى طويل (مقالات، تعليقات) نصوص قصيرة
DATE تواريخ بدون وقت تحتاج للوقت أيضاً
DATETIME تاريخ ووقت معاً تاريخ فقط أو وقت فقط
BOOLEAN قيم منطقية (نعم/لا) أكثر من خيارين
ENUM قائمة محددة من القيم القيم تتغير كثيراً

9. أخطاء شائعة يجب تجنبها

❌ خطأ 1: استخدام VARCHAR لتخزين التواريخ
-- ❌ خطأ
birth_date VARCHAR(20)  -- '15/03/1995'

-- ✅ صحيح
birth_date DATE  -- '1995-03-15'

السبب: لن تستطيع استخدام دوال التاريخ أو المقارنات الزمنية بشكل صحيح.

❌ خطأ 2: استخدام FLOAT للمبالغ المالية
-- ❌ خطأ
price FLOAT  -- قد يحدث خطأ تقريب: 19.99 قد تصبح 19.989999

-- ✅ صحيح
price DECIMAL(10, 2)  -- دقة عالية: 19.99

السبب: أخطاء التقريب قد تؤدي لمشاكل مالية خطيرة.

❌ خطأ 3: استخدام TEXT لنصوص قصيرة
-- ❌ خطأ
username TEXT  -- هدر للمساحة

-- ✅ صحيح
username VARCHAR(50)  -- كافي ومناسب

السبب: TEXT يستهلك مساحة أكبر ولا يمكن استخدامه كمفتاح أساسي.

❌ خطأ 4: استخدام BIGINT لكل شيء
-- ❌ خطأ
age BIGINT  -- هدر للمساحة (8 بايت)

-- ✅ صحيح
age TINYINT  -- كافي للأعمار (1 بايت)

السبب: استخدام أنواع أكبر من اللازم يهدر المساحة ويبطئ الأداء.

10. أفضل الممارسات

للأداء الأمثل
  • استخدم أصغر نوع بيانات ممكن
  • استخدم INT للمفاتيح الأساسية
  • حدد طول VARCHAR بدقة
  • استخدم الفهارس على الأعمدة المهمة
لسلامة البيانات
  • استخدم NOT NULL للأعمدة الإلزامية
  • استخدم DEFAULT للقيم الافتراضية
  • استخدم ENUM للقيم المحددة
  • استخدم DECIMAL للمبالغ المالية

ملخص الدرس

في هذا الدرس، تعلمنا:

  • أهمية اختيار نوع البيانات المناسب في SQL
  • الأنواع الرقمية: INT, DECIMAL, FLOAT
  • الأنواع النصية: VARCHAR, TEXT, CHAR
  • أنواع التاريخ والوقت: DATE, TIME, DATETIME, TIMESTAMP
  • النوع المنطقي: BOOLEAN
  • الأنواع الخاصة: ENUM, JSON
  • كيفية اختيار النوع المناسب لكل حالة
  • الأخطاء الشائعة وأفضل الممارسات

في الدرس القادم: سنتعلم كيفية استخدام جملة SELECT المتقدمة لاستخراج البيانات من الجداول بطرق احترافية.

الخطوة التالية: جملة SELECT المتقدمة (Advanced SELECT)

أكمل رحلتك التعليمية وانتقل إلى الدرس التالي لتعلم جملة SELECT المتقدمة (Advanced SELECT) وتطوير مهاراتك في قواعد البيانات.

الانتقال إلى الدرس التالي
المحرر الذكي

اكتب الكود وشاهد النتيجة فوراً

جرب الآن مجاناً
قناة ديف عربي

تابع أحدث الدروس والتحديثات مباشرة على واتساب

انضم الآن