أنواع البيانات في SQL
تعتبر أنواع البيانات في SQL من العناصر الأساسية التي تُبنى عليها بنية قواعد البيانات، إذ تحدد طبيعة القيم التي يمكن تخزينها في الأعمدة، وطريقة معالجتها، وحجمها، وسلوكها أثناء العمليات المختلفة مثل المقارنة والحساب والفهرسة. الاختيار غير الدقيق لنوع البيانات لا ينعكس فقط على صحة البيانات، بل يؤثر مباشرة في الأداء، واستهلاك الموارد، وقابلية التوسع والصيانة.
نقدم في هذا المقال تصور منظم لأنواع البيانات في SQL، بدءًا بتوضيح مفهومها العام ودورها في تصميم الجداول، ثم الانتقال إلى استعراض الفروقات العملية بين أشهر أنظمة إدارة قواعد البيانات. سيتم تناول أنواع البيانات في Oracle، وMySQL، وMicrosoft SQL Server، وMicrosoft Access،و PostgreSQL مع التركيز على الخصائص المميزة لكل نظام، بما يساعد على فهم أعمق عند العمل في بيئات متعددة أو عند ترحيل قواعد البيانات بين الأنظمة المختلفة....
في هذا المقال نتعرف على:
- ما هي أنواع بيانات في SQL؟
- أنواع البيانات في قواعد بيانات Oracle.
- أنواع البيانات في قواعد بيانات MySQL.
- أنواع البيانات في قواعد بيانات MS SQL Server.
- أنواع البيانات في قواعد بيانات MS Access.
- أنواع البيانات في PostgreSQL.
ما هي أنواع بيانات في SQL؟
يشير نوع بيانات في SQL إلى نوع البيانات التي يمكن تخزينها في عمود ضمن جدول في قاعدة البيانات العلائقية. في العمود، يمكن للمستخدم تخزين بيانات رقمية، أو نصية، أو ثنائية (Binary data)، وما إلى ذلك، وذلك بتحديد أنواع البيانات. على سبيل المثال: بيانات عددية (أرقام )، أو بيانات نصية أو أن تكون البيانات عبارة عن التاريخ والوقت (Date and Time) وهكذا.
فعند إنشاء جدول في قاعدة البيانات، لابد من أن نعرف الأعمدة للجدول حيث يُحدد عمود جدول قاعدة البيانات نوع البيانات، بينما تُملأ صفوف الجدول البيانات فيه. و لتعريف عمود الجدول نحتاج إلى تحديد السمتين التاليتين:
- اسم العمود.
- نوع بيانات العمود.
مما يعني أن أنواع البيانات في لغة SQL تُعرَّف أثناء إنشاء جدول في قاعدة البيانات. فعند إنشاء جدول بالإضافة إلى اسم العمود يجب تحديد أنوع البيانات لكل عمود وحجمها.
على سبيل المثال، إذا أردت تخزين اسم الطالب في عمود، فمثلاً يكون اسم العمود مثل student_name، ونوع بياناته char (100)، مما يعني أنه يستطيع تخزين نص لا يتجاوز 100حرفًا.
مما يعني أننا عندما نقوم بتعيين نوع البيانات المناسب لعمود ما، يمكننا الاستفادة بكفاءة من الذاكرة عن طريق تخصيص مقدار ذاكرة النظام المطلوبة فقط للبيانات الموجودة في العمود ذي الصلة.
وتتوافر في SQL ثلاثة أنواع رئيسية من البيانات ولأي نظام إدارة قواعد بيانات علائقية، وهي :
- بيانات نصية String.
- بيانات رقمية Numeric.
- تاريخ ووقت Date and Time.
يُوفر نوع البيانات إرشاداتٍ للغة SQL لفهم البيانات المتوقعة في كل عمود، وبالتالي يمنع المستخدم من إدخال أي بيانات غير متوقعة أو غير صالحة. على سبيل المثال، إذا أردنا أن يخزن عمودٌ ما قيمًا عددية صحيحة فقط، فيمكننا تحديد نوع بياناته كـ INT. ستُظهر SQL خطأً إذا تم إدخال أي قيمة أخرى غير عدد صحيح في هذا العمود.
تدعم أنظمة إدارة قواعد البيانات العلائقية المختلفة (المزيد عن انواع قواعد البيانات في مقال مقدمة في قواعد البيانات) أنواع بيانات مختلفة لتعريف جداولها. فيما يأتي سنتناول بالتفصيل أنواع بيانات SQL المختلفة المتوفرة في أنظمة قواعد بيانات MySQL وOracle وMS SQL Server وMS Access.
أنواع البيانات في قواعد بيانات Oracle
أنواع البيانات (Data Types) في Oracle SQL هي حجر الأساس لتصميم أي قاعدة بيانات، حيث تحدد طبيعة المعلومات التي يمكن تخزينها في كل عمود. توفر أوراكل مجموعة واسعة من الأنواع لتناسب النصوص، الأرقام، التواريخ، والملفات الكبيرة.
فيما يلي تصنيف لأهم أنواع البيانات المتوفرة في Oracle:
1. الأنواع النصية (Character Data Types)
تستخدم لتخزين النصوص، الأسماء، والرموز.
- CHAR(size): يُستخدم للنصوص ثابتة الطول ( طول مُحدد مسبقًا). إذا قمت بتخزين نص أصغر من الحجم المحدد، سيقوم أوراكل بإضافة مسافات فارغة لتكملة الطول.حيث يمكن تخزين ما يصل إلى 2000 بايت
- VARCHAR(SIZE) و VARCHAR2(size): النوع الأكثر شيوعاً، يُستخدم لتخزين النصوص متغيرة الطول. الحد الأقصى له هو 4000 بايت (أو 32,767 بايت في النسخ الحديثة إذا تم تفعيل خاصية الـ Extended).
- NVARCHAR2 و NCHAR: تُستخدم لتخزين النصوص التي تعتمد على ترميز Unicode، وهي مثالية لدعم اللغات المتعددة بشكل دولي.
2. الأنواع الرقمية (Number Data Types)
تستخدم لتخزين الأعداد الصحيحة والكسرية.
- NUMBER(p, s): النوع الشامل للأرقام ويحتوي على الدقة p والمقياس s.
- p (Precision): تتراوح الدقة p من 1 إلى 38.
- s (Scale): عدد الأرقام بعد الفاصلة العشرية ويتراوح المقياس s من -84 إلى 127.
- FLOAT: نوع فرعي من NUMBER يُستخدم للأرقام ذات الفاصلة العائمة التي تتطلب دقة متغيرة (. تتراوح الدقة p من 1 إلى 126).
- BINARY_FLOAT: يُستخدم للدقة الثنائية (32 بت). يتطلب 5 بايت، بما في ذلك بايت الطول.
- BINARY_DOUBLE: يُستخدم للدقة الثنائية المزدوجة (64 بت). يتطلب 9 بايت، بما في ذلك بايت الطول.
3. أنواع التاريخ والوقت (Datetime Data Types)
تُستخدم لتخزين المواعيد واللحظات الزمنية.
- DATE: يخزن التاريخ والوقت (بالثانية). يشمل اليوم، الشهر، السنة، الساعة، الدقيقة، والثانية.
- TIMESTAMP: مشابه لـ DATE ولكنه أكثر دقة، حيث يمكنه تخزين أجزاء من الثانية (كسور الثواني).
- TIMESTAMP WITH TIME ZONE: يخزن الوقت مع مراعاة المنطقة الزمنية، وهو مهم جداً في التطبيقات العالمية.
4. الأنواع الكبيرة (LOB - Large Objects)
تُستخدم لتخزين البيانات الضخمة التي لا يمكن وضعها في الأنواع العادية (مثل الصور أو المقالات الطويلة).
- CLOB (Character Large Object): لتخزين النصوص الضخمة (مثل محتوى كتاب)، أي لبيانات الأحرف أحادية البايت. يصل حجمه إلى 4GB.
- BLOB (Binary Large Object): لتخزين البيانات الثنائية (غير المهيكلة) مثل الصور، الفيديو، والملفات الصوتية، يصل حجمه إلى 4GB.
- BFILE: لتخزين ملفات ثنائية توجد خارج قاعدة البيانات (في نظام ملفات التشغيل)، يصل حجمه إلى 4GB.
- NCLOB : يُستخدم نوع البيانات NCLOB لتحديد بيانات النصوص التي تعتمد على ترميز (NCHAR) Unicode أحادية البايت أو متعددة البايت ذات الطول الثابت، يصل حجمه إلى 4GB.
5. أنواع أخرى مهمة
- LONG: نوع قديم لتخزين النصوص الطويلة (يُنصح باستخدام CLOB بدلاً منه الآن).
- RAW: لتخزين البيانات الثنائية الصغيرة (حتى 2000 بايت).أي البيانات الثنائية الخام ذات الطول المتغير يصل حجمه إلى 2000 بايت لكل صف، يجب تحديد الحد الأقصى لحجمه.
- ROWID: معرف فريد لكل سجل في قاعدة البيانات، يمثل العنوان الفيزيائي للسجل على القرص.
- LONG RAW: يُستخدم نوع البيانات LONG RAW لتحديد البيانات الثنائية الخام (0,1) ذات الطول المتغير. يصل حجمه إلى 2GB لكل صف.
توفر Oracle مجموعة غنية ودقيقة من أنواع بيانات SQL تُمكّن من التعامل مع البيانات النصية والرقمية والزمنية والمعقدة بكفاءة عالية. فهم خصائص هذه الأنواع وحدودها يُعد عاملًا حاسمًا في تصميم الجداول بشكل صحيح، وتحقيق أفضل أداء ممكن، خاصة في الأنظمة الكبيرة التي تتطلب موثوقية ودقة عالية في إدارة البيانات.
أنواع البيانات في قواعد بيانات MySQL
في قاعدة بيانات MySQL تتوفر ثلاثة أنواع رئيسية من البيانات: نصوص، وأرقام وتاريخ ووقت. وتختلف أنواع البيانات في MySQL قليلاً عن أوراكل، حيث توفر MySQL خيارات أكثر تخصصاً لبعض أنواع الأرقام والنصوص، مما يجعلها مرنة للغاية في إدارة المساحة التخزينية. فيما يلي قائمة بأهم أنواع البيانات في MySQL مقسمة حسب طبيعتها:
1. الأنواع النصية (String Types)
- VARCHAR(size): نصوص متغيرة الطول (الأكثر استخداماً) يمكن أن تحتوي على حروف وأرقام ورموز خاصة. يحدد مُعامل الحجم الحد الأقصى لطول السلسلة بالأحرف، الحد الأقصى يصل إلى 65,535 حرفاً.
- CHAR(size): نصوص ثابتة الطول يمكن أن تحتوي على أحرف وأرقام ورموز خاصة. يحدد مُعامل الحجم طول العمود بالأحرف، والذي يتراوح بين 0 - 255 حرفًا، الحجم الافتراضي هو 1. سريع جداً للأكواد ثابتة الطول مثل رموز الدول ISO.
- TEXT(size): يخزن نصوص بطول متغير. يمكن لهذا النوع من البيانات تخزين ما يصل إلى 2GB من البيانات النصية. ويستخدم لتخزين المقالات أو الأوصاف الطويلة. يتفرع منه (MEDIUMTEXT و LONGTEXT).
- MEDIUMTEXT : يمكن أن يمثل نص بطول أقصى يبلغ 16,777,215 حرفًا.
- LONGTEXT: يمكن أن يمثل نص يحتوي بطول أقصى يبلغ 4,294,967,295 حرفًا.
- TINYTEXT: يخزن نصوص بحد أقصى 255 حرفًا.
- ENUM: قائمة من الخيارات المحددة مسبقاً (مثل: 'Male', 'Female'). لا يسمح بإدخال قيمة خارج القائمة. ويمكن إدراج ما يصل إلى 65535 قيمة في قائمة ENUM. إذا تم إدخال قيمة غير موجودة في القائمة، فسيتم إدراج قيمة فارغة. يتم ترتيب القيم حسب ترتيب إدخالها. ENUM(val1, val2, val3, ...).
- SET: قائمة من الخيارات المحددة مسبقاً يمكن أن تحتوي على صفر أو أكثر من القيم، يمكن إدراج ما يصل إلى 64 قيمة في قائمة SET. SET(val1, val2, val3, ...).
2. الأنواع الرقمية (Numeric Types)
تتميز MySQL بتوفير أحجام مختلفة للأرقام الصحيحة لتوفير المساحة:
- INT (أو INTEGER): النوع القياسي للأعداد الصحيحة حيث يخزن عدد صحيح عادي الحجم، يمكن أن يكون موجب أو سالب. فيمكن تحديد عرض يصل إلى 11 رقمًا.
- TINYINT: للأرقام الصغيرة جداً حيث يخزن عدد صحيح صغير جدًا، يمكن أن يكون موجبًا أو سالبًا. فيمكن أن يكون موجبًا أو سالبًا. يمكن تحديد عرض يصل إلى 4 أرقام. (مثل الحالات 0 و 1، أو الأعمار).
- MEDIUMINT: عدد صحيح متوسط الحجم، يمكن أن يكون موجبًا أو سالبًا. فيمكن تحديد عرض يصل إلى 9 أرقام.
- BIGINT: للأرقام الضخمة جداً حيث يخزن عدد صحيح كبير، يمكن أن يكون موجبًا أو سالبًا. فيمكن تحديد عرض يصل إلى 20 رقمًا.(مثل معرفات التغريدات أو الأرقام التسلسلية العالمية).
- DECIMAL(p, s): للأرقام العشرية الدقيقة (يستخدم غالباً في البيانات المالية والعملات).
- FLOAT & DOUBLE: للأرقام ذات الفاصلة العائمة (الحسابات العلمية). يمكن أن تصل دقة الأرقام العشرية إلى 24 منزلة في FLOAT. بينما يمكن أن تصل دقة الأرقام العشرية إلى 53 منزلة في DOUBLE.
3. أنواع التاريخ والوقت (Date and Time)
- DATE: لتخزين التاريخ فقط بصيغة YYYY-MM-DD.
- DATETIME: لتخزين التاريخ والوقت معاً بصيغة YYYY-MM-DD HH:MM:SS
- TIMESTAMP: مشابه لـ DATETIME ولكنه مرتبط بالمنطقة الزمنية للخادم، وغالباً ما يُستخدم لتسجيل وقت إنشاء السجل تلقائياً.
- TIME: لتخزين الوقت فقط.
- YEAR: لتخزين السنة (بصيغة 4 أرقام).
4. الأنواع الثنائية والكبيرة (Binary & Large Objects)
- BLOB(size): لتخزين البيانات الثنائية مثل الصور والملفات. يُمثل هذا النوع كائنات BLOB (كائنات ثنائية كبيرة- Binary Large Objects). يحتوي على ما يصل إلى 65,535 بايت من البيانات.
- TINYBLOB: يُمثل هذا النوع (BLOBs) صغيرة الحجم حيث الحد الأقصى لطولها 255 بايت.
- MEDIUMBLOB: يُمثل هذا النوع كائنات BLOB متوسطة الحجم حيث يستوعب ما يصل إلى 16,777,215 بايت من البيانات.
- LONGBLOB: يُمثل هذا النوع كائنات BLOB كبيرة الحجم حيث يستوعب ما يصل إلى 4,294,967,295 بايت من البيانات.
- BINARY & VARBINARY: مشابهة لـ CHAR و VARCHAR ولكنها تخزن بيانات ثنائية بدلاً من نصوص.
- BINARY(size): يعادل CHAR يخزن بيانات ثنائية بعرض ثابت حيث يُحدد مُعامل الحجم طول العمود بالبايت، الحجم الافتراضي هو 1.
- VARBINARY(size) يُعادل VARCHAR، ولكنه يُخزّن سلاسل بايت ثنائية بعرض ثابت. يُحدد مُعامل الحجم الحد الأقصى لطول العمود بالبايت.
5. نوع البيانات JSON (ميزة قوية في MySQL)
JSON: تسمح MySQL بتخزين مستندات JSON كاملة داخل عمود واحد، مع إمكانية البحث داخل هذه المستندات بكفاءة عالية، مما يجمع بين مزايا قواعد البيانات SQL و NoSQL.
مقارنة مع أمثلة استخدام بين أهم الأنواع في MySQL:
| النوع | مثال | ملاحظة |
|---|---|---|
| INT | معرفات (IDs) | حجمه 4 بايت |
| VARCHAR | أسماء، إيميلات | يوفر مساحة تخزينية |
| DATETIME | مواعيد العمليات | يغطي نطاق زمني واسع |
| DECIMAL | مبالغ مالية | دقة عالية جداً |
| JSON | بيانات مرنة | يدعم البحث والتحقق |
كما نرى تتيح MySQL مجموعة مرنة من أنواع البيانات تلائم مختلف سيناريوهات الاستخدام، من التطبيقات البسيطة إلى الأنظمة ذات الأحجام الكبيرة. الاختيار الدقيق لنوع البيانات المناسب يساهم في تحسين الأداء، وتقليل استهلاك التخزين، وضمان سلامة البيانات عند التعامل معها داخل قواعد بيانات MySQL.
أنواع البيانات في قواعد بيانات MS SQL Server
يوفر نظام Microsoft SQL Server مجموعة غنية ومتنوعة من أنواع البيانات التي تلبي احتياجات الشركات الكبرى، وتتميز بوجود أنواع مخصصة للبيانات المالية والجغرافية بشكل دقيق. فيما يلي تقسيم لأنواع البيانات في MS SQL Server:
1. الأنواع الرقمية (Numeric Types)
تنقسم في SQL Server إلى أرقام صحيحة وأرقام دقيقة:
الأرقام الصحيحة:
- BIGINT: للأرقام الضخمة جداً (8 بايت).
- INT: النوع القياسي للأعداد الصحيحة (4 بايت).
- SMALLINT: للأرقام المتوسطة (2 بايت).
- TINYINT: للأرقام الصغيرة من 0 إلى 255 (1 بايت).
- BIT: لتخزين القيم المنطقية (0 أو 1)، وغالباً ما يُستخدم كـ Boolean.
الأرقام المالية والعشرية:
- DECIMAL / NUMERIC: لتخزين الأرقام بدقة ثابتة (مثالي للحسابات الحساسة).
- MONEY / SMALLMONEY: أنواع مخصصة لتخزين القيم النقدية والعملات.
- FLOAT / REAL : لتخزين الأعداد العشرية ذات الدقة العالية.
2. الأنواع النصية (Character Strings)
يفرق SQL Server بشكل واضح بين النصوص العادية ونصوص Unicode (التي تدعم لغات مثل العربية):
نصوص عادية (Non-Unicode):
- CHAR(n): نص بطول ثابت حيث يكون الحد الأقصى لحجم هذا النوع من البيانات هو 8000 حرف.
- VARCHAR(n): نص بطول متغير ويكون الحد الأقصى لحجم هذا النوع من البيانات هو 8000 حرف.
- VARCHAR(MAX) / TEXT : لتخزين نصوص ضخمة بطول متغير جداً تصل إلى 2GB.
نصوص Unicode (تدعم العربية):
- NCHAR(n): طول ثابت يدعم كافة اللغات ويبلغ الحد الأقصى لحجم هذا النوع من البيانات 4000 حرف.
- NVARCHAR(n): طول متغير ويبلغ الحد الأقصى لحجم هذا النوع من البيانات 4000 حرف. و يدعم كافة اللغات (الأكثر استخداماً في العالم العربي).
- NVARCHAR(MAX): للنصوص الضخمة التي تحتوي على لغات متنوعة.
- NTEX: يخزن Unicode بطول متغير. يمكن لهذا النوع من البيانات تخزين ما يصل إلى 2GB من البيانات النصية.
الفرق بين VARCHAR و NVARCHAR من حيث المساحة التخزينية والأداء
| وجه المقارنة | VARCHAR | NVARCHAR |
|---|---|---|
| الترميز | يستخدم ASCII أو Code Page محددة. | يستخدم Unicode (ترميز عالمي). |
| المساحة | كل حرف يستهلك 1 بايت. | كل حرف يستهلك 2 بايت |
| دعم اللغات | يدعم الإنجليزية واللغات اللاتينية بشكل أساسي. | يدعم جميع اللغات (العربية، الصينية، اليابانية، إلخ). |
| السعة القصوى | حتى 8,000 حرف (أو 2GB مع MAX). | حتى 4,000 حرف (أو 2GB مع MAX). |
3. التاريخ والوقت (Date and Time)
- DATE: تاريخ فقط (YYYY-MM-DD).
- TIME: وقت فقط.
- DATETIME: النوع التقليدي (تاريخ ووقت).
- DATETIME2: النسخة الحديثة والأكثر دقة من النوع السابق (نطاق تاريخ أوسع ودقة أعلى في أجزاء الثانية).
- DATETIMEOFFSET: لتخزين التاريخ والوقت مع مراعاة فرق التوقيت العالمي (Time Zone).
4. الأنواع الثنائية والكبيرة (Binary)
- BINARY:يخزن بيانات ثنائية (binary string ) بطول ثابت.
- VARBINARY(n): لتخزين البيانات الثنائية متغيرة الطول.
- VARBINARY(MAX): يُستخدم لتخزين الصور، الملفات، أو المستندات داخل قاعدة البيانات (بديل لنوع IMAGE القديم).
5. أنواع بيانات خاصة ومتطورة
يتميز SQL Server ببعض الأنواع التي قد لا تجدها في أنظمة أخرى بنفس الكفاءة:
- XML: لتخزين بيانات بتنسيق XML مع إمكانية التحقق منها والاستعلام داخلها.
- UNIQUEIDENTIFIER: لتخزين قيم GUID (مثل: 6F9619FF-8B86-D011-B42D-00C04FC964FF).
- GEOMETRY / GEOGRAPHY: لتخزين البيانات الجغرافية والإحداثيات (الخرائط).
- HIERARCHYID: لتمثيل العلاقات الهرمية (مثل الهيكل التنظيمي للموظفين).
أمثلة استخدام
| النوع في SQL Server | المثال |
|---|---|
| NVARCHAR(100) | اسم شخص بالعربي |
| DECIMAL(10, 2) أو MONEY | سعر منتج |
| BIT | حالة (نشط / غير نشط) |
| VARBINARY(MAX) | صورة أو ملف PDF |
| VARCHAR(255) | رابط خارجي أو إيميل |
يوفر MS SQL Server أنواع بيانات متقدمة ودقيقة تلبي متطلبات الأنظمة المؤسسية والتطبيقات ذات الأحجام الكبيرة. الفهم الجيد لهذه الأنواع واستخدامها بالشكل الصحيح يساعد على تحسين الأداء، وضمان تكامل البيانات، والاستفادة القصوى من إمكانات محرك قاعدة البيانات.
أنواع البيانات في قواعد بيانات MS Access
يعتبر نظام Microsoft Access مختلفاً قليلاً عن الأنظمة السابقة (مثل SQL Server أو Oracle)، حيث يركز على سهولة الاستخدام في بيئة سطح المكتب. تنقسم أنواع البيانات فيه إلى ما يراه المستخدم في واجهة التصميم (Design View) وما يقابلها من مسميات عند كتابة أوامر SQL. فيما يلي قائمة بأنواع البيانات المتوفرة في MS Access:
1. الأنواع النصية (Text Types)
- نص مختصر (Short Text): كان يُسمى سابقاً "Text". يُستخدم لتخزين النصوص القصيرة (أسماء، عناوين) حتى 255 حرفاً.
- نص طويل (Long Text): كان يُسمى سابقاً "Memo". يُستخدم لتخزين كميات ضخمة من النصوص والفقرات تصل إلى 1GB.
2. الأنواع الرقمية (Numeric Types)
في Access، يتم اختيار نوع "Number" ثم تحديد "حجم الحقل" (Field Size) من الخصائص:
- Byte: للأرقام الصغيرة جداً (0 إلى 255).
- Integer: للأعداد الصحيحة (من -32,768 إلى 32,767).
- Long Integer: النوع الافتراضي للأرقام الصحيحة الكبيرة (وهو المستخدم غالباً للمفاتيح الأساسية).
- Single / Double: للأرقام العشرية (الفاصلة العائمة).
- Decimal: للأرقام التي تتطلب دقة عالية جداً.
- Large Number: (في النسخ الحديثة) يدعم أرقاماً ضخمة جداً تتوافق مع BIGINT في SQL Server.
3. التاريخ والوقت (Date/Time)
- تاريخ/وقت (Date/Time): لتخزين التواريخ والأوقات للأعوام من 100 إلى 9999 م.
- تاريخ/وقت ممتد (Date/Time Extended): نوع أحدث يوفر دقة أكبر ونطاقاً زمنياً أوسع.
4. أنواع خاصة بـ Access
يتميز Access بأنواع بيانات تسهل بناء التطبيقات مباشرة مثل :
- ترقيم تلقائي (AutoNumber): يقوم بإنشاء رقم فريد تلقائياً لكل سجل جديد (يُستخدم كـ Primary Key).
- نعم/لا (Yes/No): لتخزين القيم المنطقية (صح True /خطأ False).
- عملة (Currency): مخصص للبيانات المالية لمنع أخطاء التقريب أثناء الحسابات.
- كائن OLE: لتخزين الصور أو مستندات Word/Excel (يُفضل حالياً استخدام "مرفق").
- مرفق (Attachment): لتخزين ملفات متعددة (صور، PDF) داخل الحقل الواحد بشكل مضغوط.
- ارتباط تشعبي (Hyperlink): لتخزين روابط المواقع الإلكترونية أو عناوين البريد.
تعتمد قواعد بيانات MS Access على أنواع بيانات مبسطة ومباشرة تناسب التطبيقات الصغيرة والمتوسطة. الاختيار الصحيح لنوع البيانات يسهّل تصميم الجداول، ويحسّن تنظيم البيانات، ويقلل من الأخطاء أثناء الإدخال والمعالجة داخل بيئة Access.
أنواع البيانات في PostgreSQL
PostgreSQL (ويُعرف أيضاً باسم Postgres) هو نظام إدارة قواعد بيانات علائقي كائني (Object-Relational Database Management System) مجاني ومفتوح المصدر، يعتمد على لغة الاستعلام المهيكلة . وتتميز PostgreSQL بأنها واحدة من أكثر قواعد البيانات غنى وتطوراً من حيث أنواع البيانات، حيث توفر أنواعاً متقدمة قد لا نجدها في الأنظمة الأخرى، مما يمنحها مرونة عالية جداً. فيما يلي تقسيم لأهم أنواع البيانات في PostgreSQL:
1. الأنواع الرقمية (Numeric Types)
الأعداد الصحيحة:
- SMALLINT: أرقام صغيرة (2 بايت).
- INTEGER (أو INT): القياسي (4 بايت).
- BIGINT: للأرقام الضخمة (8 بايت).
الأرقام التلقائية (Auto-increment):
- SMALLSERIAL / SERIAL / BIGSERIAL: تُنشئ أرقاماً متسلسلة تلقائياً (تُستخدم كـ Primary Key).
الأرقام العشرية والمالية:
- NUMERIC / DECIMAL: أرقام دقيقة جداً (للحسابات المالية).
- REAL / DOUBLE PRECISION: للفاصلة العائمة.
- MONEY: مخصص للعملات والمبالغ المالية.
2. الأنواع النصية (Character Types)
- VARCHAR(n): نصوص متغيرة الطول بحد أقصى n.
- CHAR(n): نصوص ثابتة الطول.
- TEXT: لتخزين نصوص بأطوال غير محدودة دون التأثير على الأداء (تتراوح سعتها حتى 1 جيجابايت).
في PostgreSQL، يتمتع كل من نوعي البيانات VARCHAR و CHAR بنفس الحد الأقصى للمساحة التخزينية، ولكنهما يختلفان في آلية التعامل مع المساحة الفارغة. حيث أن الحد الأقصى للنص (عدد الحروف): 10,485,760 حرفاً (حوالي 10.4 مليون حرف)، و الحد الأقصى للمساحة التخزينية (بالبايت): 1 جيجابايت (1GB) إجمالياً للسجل/الحقل الواحد.
- ARCHAR(n) (Variable Character): تخزن النص بطوله الفعلي دون إضافة مسافات. فإذا قمنا بتحديد VARCHAR(100) وأدخلت كلمة من 5 حروف، فسيتم تخزين 5 حروف فقط ولن يتم هدر المساحة.و إذا لم نحدد الطول (أي كتبت VARCHAR فقط دون تحديد n)، فإنها تصبح بلمت مفتوح وتستوعب حتى 1 جيجابايت (مثل نوع TEXT).
- CHAR(n) (Fixed Character): تخزن النص بطول ثابت.فإذا قمنا بتحديد CHAR(10) وأدخلت كلمة من 5 حروف، سيقوم PostgreSQL بإضافة 5 مسافات فارغة على اليمين لتكملة الحجم إلى 10.وإذا لم نحدد الطول (كتبت CHAR فقط)، فأنها تعتبر تلقائياً CHAR(1) وتستوعب حرفاً واحداً فقط.
ملاحظة مهمة: السقف الفعلي للحجم يتحدد بالمساحة التخزينية (1 جيجابايت). بما أن ترميز Unicode (مثل UTF-8) قد يستهلك من 1 إلى 4 بايت للحرف الواحد (الحروف العربية مثلاً تستهلك 2 بايت عادةً)، فإن الحد الأقصى لعدد الحروف قد يقل إذا كانت النصوص تحتوي على رموز تستهلك بايتات أكثر.
عموماً مع PostgreSQL، لا يوجد فرق في الأداء بين VARCHAR و CHAR و TEXT. لذلك، يُنصح دائماً باستعمال VARCHAR(n) إذا كنا نريد التقييد بطول محدد، أو استخدام TEXT (أو VARCHAR بدون تحديد n) للحقول مفتوحة الطول، مع الابتعاد عن استخدام CHAR إلا في حالات نادرة جداً (مثل إدخال أكواد ثابتة الطول كرموز الدول المكونة من حرفين أو ثلاثة) لتجنب مشكلة المسافات الفارغة المضافة تلقائياً.
3. أنواع التاريخ والوقت (Datetime Types)
- DATE: تاريخ فقط.
- TIME: وقت فقط (مع أو بدون المنطقة الزمنية TIME WITH TIME ZONE).
- TIMESTAMP: تاريخ ووقت معاً.
- TIMESTAMPTZ: تاريخ ووقت مع المنطقة الزمنية (أفضل ممارسة مستحسنة في PostgreSQL).
- INTERVAL: لتخزين المدة الزمنية (مثل: 3 days 4 hours).
4. الأنواع المتقدمة والحديثة (نقاط قوة PostgreSQL)
- JSON / JSONB:
- JSON: يخزن النصوص كما هي.
- JSONB: يخزن البيانات بتنسيق ثنائي مجمع، مما يسمح بفرز وفهرسة (Indexing) بيانات JSON بسرعة فائقة (ممتاز لتقنيات NoSQL).
- BOOLEAN: يدعم true و false و null.
- UUID: لتخزين المعرفات الموحدة عالمياً (مثل: a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11).
- ARRAY: يسمح بتخزين مصفوفة من العناصر (مثل قائمة أرقام أو نصوص) داخل عمود واحد.
5. أنواع الشبكات والبيانات الجغرافية
شبكات الاتصال:
- INET / CIDR: لتخزين عناوين IP (v4 و v6).
- MACADDR: لتخزين عناوين الـ MAC الخاص بكروت الشبكة.
المجالات والأشكال الجغرافية:
- POINT, LINE, POLYGON: لتخزين الأشكال الهندسيّة والإحداثيات.
جدول مقارنة بين PostgreSQL و الأنظمة الأخرى
| الفئة | PostgreSQL | MySQL | SQL Server |
|---|---|---|---|
| القيم التلقائية | SERIAL | AUTO_INCREMENT | IDENTITY |
| مستندات JSON | JSONB | JSON | VARCHAR(MAX) |
| المصفوفات | مدعومة (TEXT[]) | غير مدعومة | غير مدعومة |
| عناوين الشبكة | LINET | غير مدعوم كنوع مستقل | غير مدعوم كنوع مستقل |
يتميز PostgreSQL بتنوع أنواع البيانات التي يقدمها، مع دعمه لأنواع متقدمة مثل JSONB والمصفوفات و UUID والبيانات الجغرافية عبر الإضافات، إلى جانب الأنواع التقليدية كالأرقام والنصوص والتواريخ. ويجعل هذا التنوع PostgreSQL مناسبًا لبناء قواعد بيانات تتعامل مع هياكل بيانات مختلفة، بينما يظل اختيار نوع البيانات المناسب خطوة أساسية لضمان كفاءة التخزين وسرعة الاستعلامات وسلامة البيانات.
قبل الختام نقدم فيما يلي ملخص لأهم الفروق بين انواع البيانات لأهم أنظمة قواعد البيانات:
وجه الفرق | Oracle | MySQL | MS SQL Server | PostgreSQL |
|---|---|---|---|---|
| دعم لغات Unicode | توفر أنواعًا مخصصة مثل NVARCHAR2 و NCHAR. | تدعم الترميز مباشرة داخل أنواع النصوص العادية | تشترط إضافة حرف N للأنواع (مثل NVARCHAR و NCHAR) | تدعم الترميز بشكل تلقائي ومباشر داخل أنواع النصوص |
| التنوع في الأرقام | تعتمد بشكل رئيسي على النوع الشامل NUMBER(p, s) | توفر خيارات متعددة لتوفير المساحة (TINYINT, MEDIUMINT, BIGINT) | توفر أنواعًا مخصصة للبيانات المالية والعملات مثل MONEY و SMALLMONEY | توفر أنواعًا رقمية متقدمة إضافة للأنواع القياسية |
| حد السعة للنصوص العادية | يقتصر VARCHAR2 على 4,000 بايت (أو 32,767 بايت عند تفعيل التوسعة) | تصل سعة VARCHAR إلى 65,535 حرفًا | يقتصر VARCHAR على 8,000 حرف (ويتطلب VARCHAR(MAX) للسعات الأكبر) | تتيح تخزين النصوص بأحجام ضخمة. |
| مستندات JSON | تدعم التخزين بصيغ متعددة | تتميز بنوع مخصص JSON يتيح البحث الداخلي بكفاءة | تتعامل مع JSON كنصوص مع دوال استعلام | تدعم نوعي JSON و JSONB للبحث السريع |
| الأنواع المتقدمة والخاصة | تنفرد بأنواع مثل ROWID (العنوان الفيزيائي) و BFILE (الملفات الخارجية) | توفر أنواع الخيارات المحددة مثل ENUM و SET | تنفرد بأنواع جغرافية (GEOMETRY/GEOGRAPHY) وهيكلية (HIERARCHYID) و UNIQUEIDENTIFIER | تتميز بأنواع شبكات الأجهزة (INET, MACADDR) والمصفوفات |
في ختام هذا المقال، يتضح أن أنواع البيانات في SQL ليست مجرد تصنيفات شكلية، بل تمثل أساسًا تقنيًا يؤثر في دقة تخزين البيانات، وسلامة المعالجة، وكفاءة الأداء عبر مختلف أنظمة إدارة قواعد البيانات. ورغم وجود مفاهيم مشتركة بين Oracle وMySQL وMS SQL Server وMS Access، و PostgreSQL إلا أن الاختلافات في التنفيذ والدعم والقيود تجعل فهم هذه الفروق أمرًا ضروريًا عند التصميم أو التطوير أو الترحيل بين الأنظمة.
