البيانات في SQL: أنواعها والقيود عليها
تُعتبر لغة الاستعلامات البنيوية (SQL – Structured Query Language) من اللغات الأساسية في إدارة قواعد البيانات العلائقية (Relational Databases)، حيث تُستخدم لإنشاء الجداول وتخزين البيانات واسترجاعها وتحديثها وحذفها. ويُعد فهم أنواع البيانات (Data Types) والقيود (Constraints) أحد الأعمدة الأساسية لتصميم قواعد بيانات قوية وفعالة وآمنة.
يمتاز نظام إدارة قواعد البيانات القائم على SQL بالمرونة في التعامل مع أنواع متعددة من البيانات، وفي الوقت نفسه بتوفير أدوات قوية لفرض شروط وضوابط تضمن تكامل البيانات (Data Integrity) وصحتها. في هذا المقال، يتم تناول تفصيلي لأهم أنواع البيانات المعتمدة في SQL والقيود المختلفة التي يمكن فرضها على الجداول، مع أمثلة تطبيقية لتوضيح ذلك.
أولاً: أنواع البيانات في SQL
أنواع البيانات تحدد طبيعة القيم التي يمكن تخزينها في أعمدة الجداول. كل نوع بيانات يسمح بخصائص محددة من حيث الحجم، والدقة، وطريقة المعالجة. يتم تقسيم أنواع البيانات في SQL إلى عدة فئات رئيسية:
1. الأنواع الرقمية (Numeric Data Types)
تُستخدم هذه الأنواع لتخزين الأرقام سواء كانت أعداد صحيحة أو ذات فواصل عشرية:
| نوع البيانات | الوصف | أمثلة |
|---|---|---|
INT أو INTEGER |
عدد صحيح 32-بت | 42، -100، 0 |
SMALLINT |
عدد صحيح صغير (16-بت) | 32000، -2000 |
TINYINT |
عدد صحيح صغير جداً (8-بت) | 0 إلى 255 |
BIGINT |
عدد صحيح كبير (64-بت) | أرقام ضخمة |
DECIMAL(p,s) |
عدد عشري بدقة ثابتة | DECIMAL(5,2) يخزن 999.99 |
NUMERIC(p,s) |
مماثل لـ DECIMAL |
– |
FLOAT |
عدد عشري بدقة عائمة | 3.14159 |
REAL |
عدد عشري بدقة أقل من FLOAT |
2.718 |
2. الأنواع النصية (Character and String Data Types)
تُستخدم لتخزين النصوص والكلمات والجمل:
| نوع البيانات | الوصف | أمثلة |
|---|---|---|
CHAR(n) |
سلسلة نصية بطول ثابت | CHAR(10) يخزن 10 رموز |
VARCHAR(n) |
سلسلة نصية بطول متغير | VARCHAR(255) |
TEXT |
سلسلة نصية طويلة | مقالات، ملاحظات |
3. الأنواع المنطقية (Boolean)
| نوع البيانات | الوصف | أمثلة |
|---|---|---|
BOOLEAN |
يحتوي على قيمتين فقط: TRUE أو FALSE | TRUE، FALSE |
4. أنواع التاريخ والوقت (Date and Time)
تُستخدم لتخزين بيانات متعلقة بالتواريخ والأوقات:
| نوع البيانات | الوصف | أمثلة |
|---|---|---|
DATE |
تاريخ فقط | ‘2025-06-08’ |
TIME |
وقت فقط | ’14:35:00′ |
DATETIME |
تاريخ ووقت | ‘2025-06-08 14:35:00’ |
TIMESTAMP |
طابع زمني (مخصص للتعقب) | ‘2025-06-08 14:35:00.000000’ |
5. أنواع البيانات الثنائية (Binary Data Types)
تُستخدم لتخزين البيانات غير النصية، مثل الصور أو الملفات:
| نوع البيانات | الوصف |
|---|---|
BINARY(n) |
سلسلة بايت بطول ثابت |
VARBINARY(n) |
سلسلة بايت بطول متغير |
BLOB |
كائن ثنائي كبير (Binary Large Object) |
ثانياً: القيود في SQL (SQL Constraints)
القيود هي قواعد تُفرض على الأعمدة لضمان صحة البيانات والحفاظ على تكاملها. يمكن تطبيق هذه القيود عند إنشاء الجدول أو تعديله لاحقاً، وتساعد في تقليل الأخطاء وتحقيق الاتساق في قاعدة البيانات.
1. القيد NOT NULL
يُستخدم لمنع العمود من قبول القيم الفارغة (NULL):
sqlCREATE TABLE الموظفين (
id INT NOT NULL,
الاسم VARCHAR(100) NOT NULL
);
هذا يعني أن كل سجل يجب أن يحتوي على قيمة في كلا العمودين.
2. القيد UNIQUE
يُضمن أن تكون القيم في العمود فريدة وغير مكررة:
sqlCREATE TABLE المستخدمون (
email VARCHAR(255) UNIQUE
);
لا يمكن إدخال نفس البريد الإلكتروني مرتين.
3. القيد PRIMARY KEY
يُستخدم لتحديد العمود أو مجموعة الأعمدة التي تميز كل سجل في الجدول:
sqlCREATE TABLE المنتجات (
id INT PRIMARY KEY,
الاسم VARCHAR(100)
);
المفتاح الأساسي يجمع بين NOT NULL و UNIQUE.
4. القيد FOREIGN KEY
يُستخدم لربط الجداول ببعضها البعض، أي لربط عمود ما بعمود في جدول آخر:
sqlCREATE TABLE الطلبات (
id INT PRIMARY KEY,
id_العميل INT,
FOREIGN KEY (id_العميل) REFERENCES العملاء(id)
);
يساعد هذا القيد في الحفاظ على التكامل المرجعي بين الجداول.
5. القيد CHECK
يُستخدم لفرض شروط على القيم المدخلة في العمود:
sqlCREATE TABLE الطلاب (
العمر INT CHECK (العمر >= 18)
);
أي قيمة للعمر يجب أن تكون 18 أو أكثر.
6. القيد DEFAULT
يُحدد قيمة افتراضية إذا لم يتم توفير قيمة أثناء الإدخال:
sqlCREATE TABLE الفواتير (
التاريخ DATE DEFAULT CURRENT_DATE
);
إذا لم يُدخل المستخدم قيمة للتاريخ، سيتم تعيين التاريخ الحالي تلقائياً.
ثالثاً: التكامل بين أنواع البيانات والقيود
ينبغي تصميم الجداول بحيث يتم التوافق بين نوع البيانات والقيد المفروض عليها. على سبيل المثال، لا يمكن استخدام قيد CHECK لمقارنة سلسلة نصية بقيمة عددية، أو تعيين قيد UNIQUE على عمود يقبل قيم مكررة. إن دمج أنواع البيانات المناسبة مع القيود الصحيحة يمنح قاعدة البيانات قوة وصلابة تمنع الكثير من الأخطاء.
مثال عملي شامل:
sqlCREATE TABLE الموظفون (
id INT PRIMARY KEY,
الاسم VARCHAR(100) NOT NULL,
الراتب DECIMAL(10,2) CHECK (الراتب >= 3000),
تاريخ_التوظيف DATE DEFAULT CURRENT_DATE,
البريد_الإلكتروني VARCHAR(255) UNIQUE
);
هذا الجدول يتضمن معظم أنواع القيود الأساسية: مفتاح أساسي، قيد عدم القبول بالقيم الفارغة، قيد الفريدة، قيد التحقق، وقيمة افتراضية.
رابعاً: الفروقات بين أنواع البيانات في أنظمة SQL المختلفة
رغم أن أنواع البيانات والقيود في SQL قياسية، إلا أن بعض أنظمة قواعد البيانات (مثل MySQL، PostgreSQL، SQL Server، Oracle) تختلف قليلاً في التطبيق أو توفر أنواعاً مخصصة:
| نوع قاعدة البيانات | ملاحظات مميزة |
|---|---|
| MySQL | يسمح باستخدام ENUM وSET كأنواع بيانات |
| PostgreSQL | يدعم أنواع بيانات مخصصة وأنواع JSON |
| SQL Server | يملك أنواع بيانات مثل MONEY و UNIQUEIDENTIFIER |
| Oracle | يستخدم NUMBER بدلاً من INT و VARCHAR2 بدلاً من VARCHAR |
خامساً: أهمية اختيار نوع البيانات المناسب
اختيار نوع البيانات المناسب ليس قراراً عشوائياً بل يجب أن يكون مدروساً. استخدام أنواع بيانات أكبر من اللازم يؤدي إلى استهلاك غير مبرر للذاكرة والتخزين، بينما استخدام أنواع ضيقة قد يؤدي إلى فقدان البيانات أو حدوث أخطاء. على سبيل المثال، إذا تم استخدام TINYINT لتخزين أعمار الأشخاص في نظام يتضمن كبار السن، فقد لا تكفي المساحة المتوفرة فيه.
كذلك، استخدام TEXT لتخزين محتوى قصير قد يكون غير مثالي، وقد يؤدي إلى صعوبة في عمليات الفهرسة. لذلك، يجب على مصمم قواعد البيانات أن يوازن بين الأداء، وسهولة المعالجة، ودقة التمثيل.
سادساً: فائدة القيود في أمن وصحة البيانات
القيود تعتبر خط الدفاع الأول ضد إدخال بيانات غير صحيحة. فهي تقلل من الاعتماد على البرامج الخارجية للتحقق من البيانات، مما يجعل قاعدة البيانات أكثر استقلالية وموثوقية. على سبيل المثال، قيد FOREIGN KEY يمنع حذف سجل في الجدول المرتبط ما لم يتم حذف كافة السجلات المرتبطة به، مما يمنع حدوث البيانات اليتيمة (Orphan Records).
سابعاً: الجداول التوضيحية للأنواع والقيود
جدول: مقارنة بين أنواع البيانات النصية
| النوع | الطول | ثابت/متغير | الاستخدام المثالي |
|---|---|---|---|
| CHAR(n) | n | ثابت | رموز موحدة الطول مثل رموز الدول |
| VARCHAR(n) | حتى n | متغير | أسماء، عناوين بريدية |
| TEXT | حتى 2^16 | متغير | مقالات، وصف مطوّل |
جدول: أهم القيود في SQL
| القيد | الوظيفة | أمثلة مناسبة |
|---|---|---|
| NOT NULL | منع القيم الفارغة | الاسم، رقم الهوية |
| UNIQUE | منع التكرار | البريد الإلكتروني |
| PRIMARY KEY | تعريف السجل | رقم العميل |
| FOREIGN KEY | التكامل المرجعي | رقم الطلب مقابل العميل |
| CHECK | شروط إضافية | العمر أكبر من 18 |
| DEFAULT | قيمة افتراضية | التاريخ الحالي |
ثامناً: الاعتبارات الأمنية لأنواع البيانات والقيود
من الناحية الأمنية، تساعد القيود على الحماية من إدخال بيانات ضارة مثل SQL Injection، حيث أن تقييد نوع البيانات وقيمها يقلل من احتمالية تنفيذ أوامر ضارة من خلال مدخلات المستخدمين. كذلك، يساعد التحقق الصارم عبر CHECK وNOT NULL وUNIQUE على الحماية من ازدواجية البيانات، ومنع تخزين بيانات ناقصة أو خاطئة.
تاسعاً: الاعتبارات الخاصة بالأداء
اختيار نوع البيانات يؤثر بشكل مباشر على أداء الاستعلامات. استخدام أنواع بيانات دقيقة وصحيحة يقلل من حجم الجداول ويزيد من سرعة الفهرسة والاستعلام. على سبيل المثال، استخدام INT بدلاً من BIGINT عندما يكون ذلك كافياً يقلل من حجم الذاكرة المستهلكة. كما أن استخدام VARCHAR بدلاً من TEXT في الحالات المناسبة يمكن أن يحسّن من أداء البحث والفرز.
المراجع
-
Elmasri, Ramez, and Shamkant B. Navathe. Fundamentals of Database Systems. Pearson.

