المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : 4-انواع الحقول فى قواعد البيانات Database data types(دورة MySql )


رائد ابو فيصل
19-03-2010, 06:33 PM
بسم الله الرحمن الرحيم

السلام عليكم ورحمة الله وبركاته

بمجرد ان تستطيع التخطيط لكل مايمكن ان تحتاجه
من جداول بقاعدة البيانات للتطبيق الذى تبرمجه


يجب ان تحدد انواع الحقول داخل الجداول - و هناك ثلاث انواع عامة للحقول


•ارقام

•نصوص

•وقت وتاريخ


بداخل كل نوع من هذه الأنواع هناك عدة تفرعات.

فيما يلى قائمة بلأنواع التى تأتى تحت تصنيف الأرقام
+ حجم هذا النوع, + وصف مختصر له يصف استخدام هذا الحقل.


•TINYINT[length] الحجم 1 بايت, ارقام تبدأ من -128 الى 127 او من 0 الى 255 فى حالة الـ unsigned

•SMALLINT[length] الحجم 2 بايت, ارقام تبدأ من -32,768 الى 32,767 او من 0 الى 65535 فى حالة الـ unsigned

•MEDIUMINT[length] الحجم 3 بايت, ارقام تبدأ من -8,388,608 الى 8,388,607
او من 0 الى 16,777,215 فى حالة الـ unsigned


•INT[length] الحجم 4 بايت, ارقام تبدأ من -2,147,483,648 الى 2,147,483,647
او من 0 الى 4,294,967,295 فى حالة الـ unsigned

•BIGINT[length] الحجم 8 بايت, ارقام تبدأ من -9,223,372,036,854,775,808
الى 9,223,372,036,854,775,807 او من 0 الى 18,446,744,073,709,551,615فى حالة الـ unsigned

•FLOAT[Length, Decimals] الحجم 4 بايت, رقم صغير يحتوى على علامة فصل عشرية مثل 20,1

•DOUBLE[Length, Decimals] الحجم 8 بايت, رقم كبير يحتوى على علامة فصل عشرية.

•DECIMAL[Length, Decimals] الـ length +1 او 2 بايت وهذا النوع يتم تخزين الأرقام التى بها اكثر من علامة فصل عشرية.



فى الأنواع اعلاه رأينا [length] هذه الكلمة ترمز لطول الحقل ويتم اضافة هذه القيمة (اختيارى يمكن اضافتها او عدم اضافتها)مثلا عندما نحدد الحد الأقصى للطول لحقل من نوع INT

يحدد بالشكل التالى

كود:

INT(10)

بالنسبة للأنواع FLOAT, DOUBLE, و DECIMAL

الطول لتحديد الحد الأقصى لعدد الأرقام التى يمكن ادخالها والـ Decimals
هو عدد الأرقام التى يتم وضع علامة الفصلة العشرية قبلها


كامثال عندما نحدد التالى

كود:

DECIMAL(7,3)

وندخل قيمة مثل التالى

1000000

يتم ادخال هذه القيمة بالشكل التالى
1,000,000

وايضا الحالة unsigned

هذه صفة يتم اضافتها للحقول الرقمية, وتعنى ان هذا الحقل لا يقبل القيم السالبة. (وسوف نعرف كيف نقوم بهذا فيما بعد)

كما من الضرورى ان اذكرك. ان اختيار النوع الصحيح للحقل, والطول المناسب لإحتياجك. هذا يقلل من الضغط على السيرفر ويجعل كفائة برنامجك تعمل بشكل افضل.

ننتقل للنوع الثانى, النصوص.
ويأتى منها الأنواع التالية

•CHAR[length], الحجم يكون هو القيمة التى يتم تحديدها فى الـ Length بالبايت, يتم تخزين من 0 الى 255 حرف داخل هذا النوع من الحقول.

•VARCHAR[length] الحجم, هو عدد حروف النص التى يتم تخزينها

+ 1 او 2 بايت, يتم تخزين من 0 الى 255 حرف داخل هذا النوع من الحقول (او الى 65,535 حرف اذا كان اصدار MySql لديك هو 5.0.3 فما فوق)

•TINYTEXT الحجم, يكون على حسب طول النص + 1 بايت, والحد الأقصى هو 255 حرف.

•TEXT الحجم, على حسب طول النص + 2 بايت, والحد الأقصى هو 65,535 حرف.

•MEDIUMTEXT الحجم, على حسب طول النص + 3 بايت, والحد الأقصى هو 16,777,215 حرف.

•LONGTEXT الحجم, على حسب طول النص + 4 بايت, والحد الأقصى هو 4,294,967,295 حرف

•BINARY[length] الحجم, الطول الذى تحدده فى الـ length. وهذا النوع شبيه بالنوع CHAR الا انه يخزن بيانات من النوع BINARY مثل الصور والملفات (يتم تحويل الصور والملفات الى هذه الصيغة بإستخدام لغة البرمجة مثلما هو الحال فى الـ php مع الدالة base64_encode )

•VARBINARY[Length] الحجم على حسب حجم البيانات + 1 بايت.

وهذا النوع هو تماما مثل الـ VARCHAR الا انه يمكنه تخزين بيانات من نوع Binary

•TINYBLOB الحجم هو طول البيانات + 1 بايت, هذا النوع من الحقول يحفظ بيانات Binary شرط ان يكون الحد الأقصى هو 255 بايت.

•BLOB الحجم هو طول البيانات + 2 بايت, لحفظ بيانات Binary شرط ان لا تتعدى 65,535 بايت.

•MEDIUMBLOB الحجم هو طول البيانات + 3 بايت, لحفظ بيانات Binary شرط ان لا تتعدى 16,777,215 بايت.

•LONGBLOB الحجم طول البيانات + 4 بايت, لحفظ بيانات Binary مع الحد الأقصى 4,294,967,295

•ENUM الحجم 1 او 2 بايت. هذا الحقل عندما نقوم بإنشائه, ندخل له عدة قيم (اختيارات ان صح التعبير), هذه القيم كلما اردنا ادخال بيانات لهذا الحقل, يجب ان نختار من بينها واحد فقط.

مثلا عندما ننشئه, نحدد له القيمة (مثلا) "احمد, محمد, حسن" وعندما نضيف به بيانات جديدة, يجب ان نختار من بين هذه القيم واحد فقط.


•SET الحجم 1 او 2 او 3 او 4 او 8 بايت, وهذا النوع مثله مثل الـ ENUM الا انه يمكن ان تختار اكثر من قيمة للبيانات التى تدخلها.



حقول التواريخ والوقت

•DATE الحجم 3 بايت, يتم تخزين البيانات بها بالشكل YYYY[/COLOR[COLOR="blue"]]-MM-DD

•DATETIME الحجم 8 بايت, يتم حفظ البيانات بها بالشكل YYYY-MM-DD HH:MM:SS

•TIMESTAMP الحجم 4 بايت, يتم تخزين البيانات بها بالشكل
YYYYMMDDHHMMSS
تقبل بيانات حتى العام 2037 فقط.

•TIME الحجم 3 بايت, تحفظ البيانات بالشكل HH:MM:SS

•YEAR الحجم 1 بايت, والبيانات تكون بالشكل YYYY ويجب ان يكون التاريخ بين العامين 1901 الى 2155




اظنك الأن اصبح لديك خلفية جيدة حول انواع الحقول.

اذن كيف احدد اى نوع للحقل الذى يجب ان استخدمه؟

1.تحدد نوع البيانات التى سيتم تخزينها.
هل هى بيانات رقمية, ام نصية, ام تاريخ ووقت؟
واظن هذه عملية بسيطة جدا وسهلة.
اذا كانت البيانات ستكون دائما ارقام, استخدم احد حقول الأرقام.
اما اذا كان سيستخدم شئ اخر بجانب الأرقام وليس من ضمن الأرقام فى هذه الحالة استخدم حقل من حقول النصوص.

2.اختر انسب نوع حقل يناسب البيانات التى سيتم تخزينها به.
لتحسين اداء وسرعة التطبيق الذى تستخدمه دائما ضع التالى فى الإعتبار

◦الحقول ذات الأطوال الثابتة (مثل CHAR) دائما اسرع من الحقول التى تعتمد على حجم البيانات التى يتم ادخالها (مثل الـ VARCHAR) لكنها تأخذ مساحة اكبر. (سوف اضع مقارنة لتوضيح المقصود)

◦حجم الحقل يجب ان تحاول ان تجعله اصغر مايمكن, على سبيل المثال, اذا كنت تعرف انك لن تحفظ اسم مستخدم داخل الجدول username الا الأسماء التى لا يزيد طولها عن 20 حرف, اذن استخدم نوع الحقل VARCHAR مع جعل طوله 20
VARCHAR(20)

◦شئ اخر يجب وضعه فى الإعتبار, اذا ادخلت نص يحتوى على 5 بايت داخل حقل CHAR(3) لن يتم حفظ اخر حرفين, وسيتم حفظ اول ثلاث حروف فقط.



وعلى هذه العوامل تحدد انسب نوع وحجم للحقل الذى تستخدمه

3.وضع الحد الأقصى للحقول النصية والرقمية
يختلف هذا الأمر من مبرمج الى اخر, حسب مايخطط له وما يحتاجه ومايراه مناسبا.
لكن دائما لا تنسى ان تقليل الحجم + الحفاظ على عدم فقدان اى بيانات يتم اضافتها هو الحل الأمثل دائما.



ملحوظات وتنويهات اضافية

•بعض من انواع الحقول لها اكثر من اسم, مثلا INT له ايضا الإسم INTEGER
و DEC هو نفسه DECIMAL

•حقل الـ TIMESTAMP يتم تحديثه تلقائيا عند القيام بأى اجراء مثل INSERT او UPDATE وايضا الوقت الذى يوضع به مأخوذ من إعدادات الوقت والتاريخ التى تم إعدادهم بخادم الـ MYSQL بالتالى انا شخصيا لا انصح بإستخدامه. عوضا عنه استخدم حقل رقمى يسمح لك بإضافة حتى 70 رقم مثل

INT(70) وقم بإدخال قيمة هذا الحقل بإستخدام البرمجة التى تستخدمها (مثل الـ PHP)


•نوع الحقل BLOB هو نفسه TEXT الا انه يسمح بإضافة بيانات Binary والتى تسمح لك بوضع ملفات داخل قاعدة البيانات. الا انى بكل الأحوال انصحك بعدم القيام بهذا, حيث ان حفظ الملفات داخل قاعدة البيانات يتسبب بضغط كبير على الخادم.

•شئ اخر بالنسبة لحقول التاريخ والوقت, وهذا الأمر يسرى على اصدارات MySql 5.0.2 فما فوق, وهو انه سوف يتم التحقق من صحة التاريخ, بمعنى ان قاعدة البيانات لن تقبل الرقم 13 فما فوق, كارقم للشهر, ولن تقبل الرقم 32 فما فوق كارقم لليوم. وايضا لن تقبل تاريخ مثل هذا 31-2-2006
حيث ان شهر 2 عام 2006 لم يكن به 31 يوم!

•بالنسبة لطول الحقول النصية, 1 بايت يعنى حرف واحد فقط بالنسبة للغة الإنجليزية, لكن الحقول التى ستضع به حروف مثل حروف اللغة العربية, يجب ان تضع فى الإعتبار ان اغلب حروف اللغة العربية تكون اكثر من 1 بايت. بالتالى ستحتاج لمزيد من الحجم للحقل.



مقارنة بين CHAR و VARCHAR

قد تتسائل لماذا يوجد نوعين للحقول مثل CHAR و VARCHAR فى حين ان الأثنين
يتم تخزين القيم النصية بهم, ولا تجد سبب مقنع لهذا.

هذه المقارنة لتوضيح الإختلاف.

1.النوع CHAR هو نوع من انواع الحقول التى يكون حجمها ثابت, لا يقل ولا يزيد.
بمعنى اذا ادخلت مثلا الكلمة Pepo (مكونة من 4 حروف كما ترى) داخل حقل
CHAR(10)

كما ترى هناك 6 بايت غير مستخدمين, يقوم محرك الـ MySql بإضافة 6 مسافات فارغة (عند ادخال البيانات) ليعوض بهم مكان الـ 6 بايت المتبقيين, ويقوم ايضا محرك الـ MySql بحذف هذه المسافات عند استخراج هذه البيانات. بحيث تعرض لك كما ادخلتها انت. لكنها تظل تستهلك المساحة الزائدة.
لكن النوع VARCHAR اذا ادخلت الكلمة Pepo داخل حقل VARCHAR(10)

لن يتم استهلاك اكثر من الـ 4 بايت التى ادخلتها.
وعليه يتفرع من هذا الأختلاف شيئين

◦حقول الـ VARCHAR تستهلك مساحة اقل من الـ CHAR


◦اذا كنت تستخدم المحرك InnoDB كامحرك حفظ البيانات, هذا يجعل النوع CHAR يعمل بشكل اسرع (سوف نتحدث لاحقا عن معنى محرك حفظ البيانات) من النوع VARCHAR



2.هناك اختلاف اخر بين النوعين, بالنسبة لإصدارات الأقدم من MySql 5.0.3

هو ان محرك الـ MySql يقوم بحذف المساحات الإضافية عند استخراج بيانات من حقول الـ CHAR وكذلك يقوم بحذفها عند ادخال بيانات لحقول الـ VARCHAR

فـ ابتداء من الإصدار 5.0.3 للـ MySql هذه الصفة لم تعد لها وجود بالنسبة لحقول الـ VARCHAR هذا يعنى ان اى مسافات فارغة يتم ادخالها فى هذا النوع من الحقول, تظل كما هى عند استخراج البيانات.

وكا قاعدة عامة, استخدم النوع VARCHAR اذا كنت لا تعرف ماهو الحد الأدنى والأقصى لعدد الحروف التى يتم ادخالها بشكل دقيق جدا.
واستخدم الحقل CHAR عندما تكون تعرف ان البيانات التى ستدخلها بهذا الحقل لن تقل عن x حرف ولن تزيد عن x حرف. كامثال لذلك, عندما تخزن بيانات يتم تشفيرها بإستخدام لوغريتم التشفير MD5 فـ هذه الدالة دائما تشفر اى نص الى 32 حرف.



اتمنى يكون الدرس بكل جوانبه واضح. واعلم ان تشويقك للأمور العملية يزيد يوما بعد يوم, لكن دعنى اذكرك انك عندما كنت تتعلم القراءة والكتابة, لم تستطع كتابة او قراءة صفحة كاملة فى عامك الأول, لكنك بدأتها بـ أ ب.
لذلك دعنا ننتهى من أ ب حتى تستطيع تنفيذ ماهو افضل من ذلك.

مع اطيب تمنياتى بالتوفيق.


اقرأ ايضا..


•الدرس السابق التخطيط لتصميم قاعدة البيانات Database Design (http://www.abc4web.net/vb/showthread.php?p=58424#post58424)


•الدرس التالى خصائص اضافية لأنواع الحقول Databases Column Characteristics (http://www.abc4web.net/vb/showthread.php?p=58594#post58594)



من الدعم العربي

أبو يوسف
19-03-2010, 06:49 PM
مشكور أخي أبو فيصل على هذه التجميعة ووضع روابط الدروس السابقة ليسهل الرجوع إليها

.

ابو زكريا
19-03-2010, 08:02 PM
السلام عليكم ورحمة الله وبركاته

شـكــ وبارك الله فيك ـــرا لك ... لك مني أجمل تحية

abohmam
23-03-2010, 07:54 PM
شـكــ وبارك الله فيك ـــرا لك ... لك مني أجمل تحية .