[MySQL] ملاحظات على بعض أنواع الحقول

مدرج تحت قسم: مقالات
31 أغسطس 2007

أثناء تصفحي لمنتدى سوالف سوفت وجدت استفساراً حول بعض أنواع الحقول في mysql فأحببت أن أضع الجواب الصحيح بقدر الإمكان والإجابة على معظم الاستفسارات ، ولنبدأ.

أولاً: ماذا تعني UNSIGNED ؟

تعني أن الحقل هذا لا يقبل القيم العددية السالبة، وطبعاً تستخدم مع أنواع الحقول العددية

ثانياً: أنواع الحقول في mysql

SMALLINT : للقيم العددية الصحيحة الصغيرة وتتراوح بين -32768 و 32767 أما في حالة UNSIGNED فإنها تتراوح بين 0 و 65535

INT : هذه للقيم العددية العادية ، يعني ليست كبيرة جداً وليست صغيرة جداً ، وتكون بين -2147483648 و 2147483647، أما في حالة UNSIGNED فتكون بين 0 و 4294967295

TINYINT : للقيم العددية الصغيرة جداً ، وقيمتها ما بين -128 و 127 أما في حالة UNSIGNED فتكون بين 0 و 255

وهناك أنواع أخرى مثل MEDIUMINT للقيم العددية الأصغر من INT

وهناك أيضاً BIGINT : وهذه للقيم العددية الكبيرة جدا جدا وتترواح قيمتها بين -9223372036854775808 و 9223372036854775807 وفي حالة UNSIGNED فتكون بين 0 و 18446744073709551615

VARCHAR : للقيم النصية وأكبر عدد أحرف 255

TEXT : هذه أيضاً للقيم النصية وتكون أكبر من VARCHAR وأقصى عدد أحرف هو 65,535

CHAR : هذه أيضاً للقيم النصية وأقصى عدد للحروف هو 255، لكن الفرق بينها وبين VARCHAR أن هذه إذا حددت مثلاً عدد الحروف 5 وكتبت 3 فإن 2 الباقيين سيتم تعبئتهم بفراغ (space) ، أما VARCHAR فإنها تحفظ القيم بعدد الحروف فقط ولكن تزيد بايت واحد
يوجد نوع آخر وهو LONGTEXT ويقبل عدد حروف يصل إلى 4,294,967,295 أي حوالي 4GB

DATE : هذه للتاريخ فقط وتكون على شكل Y-m-d

هناك نوع آخر وهو DATETIME ويسجل التاريخ بالإضافة إلى الساعة والدقيقة والثانية
على هيئة YYYY-MM-DD HH:MM:SS

هناك نوع آخر وهو TIMESTAMP ويسجل فيه عدد الثواني منذ تاريخ 1/1/1970 الساعة 00:00:00 (توقيت اليونكس)

ملاحظة مهمة جداً : لا تحفظ الأرقام لأنها لا تُحفَظ وإنما افهم المطلوب فقط، ثم بعد ذلك سيصبح بإمكانك معرفة نوع الحقل وطوله بدون مراجعة هذه الأرقام في رأسك

ثالثاً: نصائح في تحديد نوع الحقل المناسب :

  • أولاً: نوع الحقل TINYINT استخدمه للحقول الصغيرة مثل حقل التأكد من نشر المقال أو أمثاله
  • ثانياً: نوع الحقل INT استخدمه للحقول التي تحتاج إلى رقماً كبيراً ولكن ليس كبيراً جداً مثل id و hits للمقال أو الموضوع أو أمثاله
  • ثالثاً: نوع الحقل BIGINT استخدمه للحقول الكبيرة جداً مثل عدد الزيارات للموقع hits الصفحات لأنه يصل إلى عدد كبير
  • رابعاً: نوع الحقل VARCHAR استخدمه للحقول النصية الصغيرة مثل IP و الاسم والدولة وأمثاله
  • خامساً: نوع الحقل TEXT استخدمه للنصوص الأكبر من 255 حرف وأصغر من 65 ألف حرف
  • سادساً: نوع الحقل LONGTEXT استخدمه للنصوص الكبيرة جداً الأكبر من 65 ألف حرف

أنت غير ملزم باتباع الملاحظات السابقة ويمكنك اعتبارها نصيحة :)

رابعاً: ملاحظات أخرى :

  • نوع الحقل لا علاقة له بالثغرات وإنما بنوع البيانات المحفوظة بداخله
  • من المهم أن تختار نوع الحقل المناسب وحاول قدر الامكان معرفة عدد الأحرف التي تحتاجها ولو بالتقدير
  • حاول قدر الامكان استخدام VARCHAR بدل CHAR
  • نوع الحقل يحدده نوع البيانات واستخدامه ، حاول أن تهتم بهذا الجانب
  • الحقول العددية التي لا تتطلب وجود قيمة سالبة اجعلها UNSIGNED

خامساً: روابط مهمة للجميع وأنصح بها

وأخيراً ، فإن أصبت فمن الله وإن أخطأت فمن نفسي والشيطان، ومن له رأي أو ملاحظة، فيمكننا نقاش ذلك هنا.

للكاتب Pal Coder

  • Share/Bookmark

التعليقات (13) على ”[MySQL] ملاحظات على بعض أنواع الحقول“

  1. عمرو فهمي

    جزاك الله خير ، مقالة جميلة طيبة لم أقراء مثلها فى المصادر العربية من قبل

    وما دمت قد فتحت باب النقاش فعندي استفسارين

    الأول حول تحديد نوعية الحقل BIGINT لعدد الزوار وال Hits فلماذا لا نستخدم ال VARCHAR بدلا منها لنفس الغرض فنحصل على حجم داتا أقل وقدرة كبيرة فى تمثيل العدد المناظر للزيارات وخاصة اننا لن نخضع هذه البيانات لعمليات حسابية

    أما الثاني فهو بخصوص ال TYNYINT ودوره كمجرد حقل تأكيد أو اشارة لخاصية ما كما أشرت فى المقال، فاني أستخدم حقل من نوع VARCHAR لنفس هذا الغرض مع تحديد حجمه بواحد فقط حيث أضع فى هذه الحقول القيمة صفر أو واحد

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

    وجزاك الله خير مرة آخرى

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

    بارك الله فيك يا بال على المقال الجميل هذا :)

    وايضاً أنواع هذه الحقول موجودة فى جميع إصدارات الMySQL بنفس الإعدادات فلن تختلف كثيراً ..

    ونصيحة على الهامش: يفضل دائماً عندما تدخل تاريخ إلى قاعدة البيانات يفضل إدخاله عن طريق الtime stamp لانه بيسهل عليك طريقة عرض الطريق فيما بعد ..

  3. اخي عمرو فهمي

    بالنسبة لاستخدام نوع الحقل VARCHAR للقيم العددية غير مناسب حسب بعض التجارب التي قمت بها ،

    اولا : لا يمكنك ان تحدد ان لا يقبل هذا الحقل القيم السالبة وبالتالي تحتاج الى كود PHP
    ثانيا : لا يمكنه ان يكون AUTO INCREMENT
    ثالثا : لا تضمن ان يكون هذا الحقل قيمة عددية فقط ، لانه يمكن اضافة نص اليه وهذا طبعا لا يناسب الاحصائيات

    الان استخدام VARCHAR بدل BIGINT
    استخدام BIGINT هو الافضل لعدة اسباب :
    عندما نقوم بزيادة القيمة نستخدم عملية حسابية (مثلا hits=hits+1)
    قمت بتنفيذ هذا الاستعلام مع حقل من نوع VARCHAR فتغيرت صيغة البيانات بشكل ضار جدا لكن هذا الضرر لا يظهر مع الارقام الصغيرة (يمكنك تجربة ذلك)
    كذلك عندما تتعامل مع قيمته تتأكد انها عددية وليست نصية او غيرها ، وبالتالي ستوفر عليك كود PHP للتأكد من القيمة
    ولو اردت استخدام VARCHAR ستحتاج الى استعلام لجلب القيمة ثم تحولها الى عددية ثم تقوم بزيادتها ثم استعلام لتحديث القاعدة ، استخدام BIGINT يوفر عليك هذه المشقة

    استخدام VARCHAR بدل TINYINT
    TINYINT تقوم بتخزين البيانات في بايت واحد ، اما VARCHAR فتقوم بتخزين البيانات بإضافة بايت واحد ، اي بدل واحد بايت سيكون 2 بايت ، لذا TINYINT افضل

    هذا ما لدي وارجو ان يكون قد اجبت على استفساراتك بالشكل المطلوب

    وأخيراً ، فإن أصبت فمن الله وإن أخطأت فمن نفسي والشيطان

  4. نسيت!

    هذا ربط مفيد للمقارنة بين انواع الحقول وتخزين البيانات

    http://dev.mysql.com/doc/refman/5.1/en/storage-requirements.html

  5. هلا ديفو ،

    انا وضعت رابط مانيوال mysql في المقال لانه ما في بعد ان تأخذ العلم من عند اهله :)

    timestamp ، الصراحة انا افضل النوع datetime لكن ربما يكون timestamp افضل

  6. هنا يوجد مقال اخر عن انواع الحقول وفيه معلومة اول مرة اعرفها :)

    http://www.peachpit.com/articles/article.aspx?p=30885&seqNum=7&rl=1

    The TIMESTAMP field is automatically set when an INSERT or UPDATE occurs, even if no value is specified for the field. If a table has multiple TIMESTAMP columns, only the first one will be updated when an INSERT or UPDATE is performed.

    معلومة جديدة علي :) لاني لا استخدم timestamp

  7. Pal Coder
    موضوع في الوقت المناسب بالخصوص هناك العديد من الاشخاص يقومون مثلا بوضع حقل للعنوان ويكون text وتجدة 1000 حرف اظنه استهلاك زائد وكما اشرت اخي VARCHAR جيد في هذة الامور

    UNSIGNED اغلب البرامج تفتقر اليها واولها MySmartBB وقد واجهت الاعضاء مشكلة في الرسائل الخاصة اصبحت -1 او -2 بالسالب لكن قمت بحلها في ذلك الوقت الخ….

    وشكرا اخي مجددا
    سلامات
    Dev-ly.com

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

    الدرس وافي الشرح جزاك الله كل خير ،

    استفدت كتير من المقارنة بين ال VARCHAR و بقية حقول القيم العددية

    شكرا لك اخي العزيز وفى انتظار المزيد

  9. عمرو فهمي

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

    شكرا ليك كتير أخى الكريم على التوضيح، لقد بينت لى أمور لم تكن فى ذهني
    فجزاك الله خير

  10. اهلا اخي Bruce
    فعلا ، تحديد نوع الحقل بشكل صحيح وخصائصه سيفيدك كثيرا اثناء برمجة البرنامج

    اخي Hawy_PHP
    وجزاك خيرا ان شاء الله ، وما اكثر خبايا mysql :)

    اخي عمرو فهمي ،
    العفو ، وانا ايضا بفضل سؤالك قمت ببعض التجارب فادتني في اماكن اخرى

  11. شكرا ً الف :)

  12. بارك الله فيك … موضوع مهم جداً يغفل عنه الكثير ، عند تصميم قاعدة البيانات لأي برمجية فأن الالتزام بهذه التعليمات التي ذكرتها في نهاية المقال تساعد على التقليل من حجم قاعدة البيانات و بالتالي سهولة في العمل و النسخ الأحتياطي .

  13. شكراً لك على هذا الشرح

    لقد استفدت منه كثيراً

أضف تعليقك




يمكنك استخدام الوسوم التالية في التعليق: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>


* حقول مطلوبة