[MySQL] ملاحظات على بعض أنواع الحقول
مدرج تحت قسم: مقالات
أثناء تصفحي لمنتدى سوالف سوفت وجدت استفساراً حول بعض أنواع الحقول في 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
خامساً: روابط مهمة للجميع وأنصح بها
- أنوع الحقول العددية
- أنوع حقول التاريخ والوقت
- أنواع الحقول النصية
- مقارنة بين CHAR و VARCHAR
- دوال التاريخ والوقت في php
- مقال عن دوال التاريخ والوقت في php
وأخيراً ، فإن أصبت فمن الله وإن أخطأت فمن نفسي والشيطان، ومن له رأي أو ملاحظة، فيمكننا نقاش ذلك هنا.


جزاك الله خير ، مقالة جميلة طيبة لم أقراء مثلها فى المصادر العربية من قبل
وما دمت قد فتحت باب النقاش فعندي استفسارين
الأول حول تحديد نوعية الحقل BIGINT لعدد الزوار وال Hits فلماذا لا نستخدم ال VARCHAR بدلا منها لنفس الغرض فنحصل على حجم داتا أقل وقدرة كبيرة فى تمثيل العدد المناظر للزيارات وخاصة اننا لن نخضع هذه البيانات لعمليات حسابية
أما الثاني فهو بخصوص ال TYNYINT ودوره كمجرد حقل تأكيد أو اشارة لخاصية ما كما أشرت فى المقال، فاني أستخدم حقل من نوع VARCHAR لنفس هذا الغرض مع تحديد حجمه بواحد فقط حيث أضع فى هذه الحقول القيمة صفر أو واحد
فان كنت ترى ان ما أفعله به عيب خفى لا أعرفه أو ينطوى على ضرر قد يصيب بياناتى مستقبلا فياليتك توضح لي
وجزاك الله خير مرة آخرى
وعليكم السلام ورحمة الله وبركاته,,
بارك الله فيك يا بال على المقال الجميل هذا :)
وايضاً أنواع هذه الحقول موجودة فى جميع إصدارات الMySQL بنفس الإعدادات فلن تختلف كثيراً ..
ونصيحة على الهامش: يفضل دائماً عندما تدخل تاريخ إلى قاعدة البيانات يفضل إدخاله عن طريق الtime stamp لانه بيسهل عليك طريقة عرض الطريق فيما بعد ..
اخي عمرو فهمي
بالنسبة لاستخدام نوع الحقل VARCHAR للقيم العددية غير مناسب حسب بعض التجارب التي قمت بها ،
اولا : لا يمكنك ان تحدد ان لا يقبل هذا الحقل القيم السالبة وبالتالي تحتاج الى كود PHP
ثانيا : لا يمكنه ان يكون AUTO INCREMENT
ثالثا : لا تضمن ان يكون هذا الحقل قيمة عددية فقط ، لانه يمكن اضافة نص اليه وهذا طبعا لا يناسب الاحصائيات
الان استخدام VARCHAR بدل BIGINT
استخدام BIGINT هو الافضل لعدة اسباب :
عندما نقوم بزيادة القيمة نستخدم عملية حسابية (مثلا hits=hits+1)
قمت بتنفيذ هذا الاستعلام مع حقل من نوع VARCHAR فتغيرت صيغة البيانات بشكل ضار جدا لكن هذا الضرر لا يظهر مع الارقام الصغيرة (يمكنك تجربة ذلك)
كذلك عندما تتعامل مع قيمته تتأكد انها عددية وليست نصية او غيرها ، وبالتالي ستوفر عليك كود PHP للتأكد من القيمة
ولو اردت استخدام VARCHAR ستحتاج الى استعلام لجلب القيمة ثم تحولها الى عددية ثم تقوم بزيادتها ثم استعلام لتحديث القاعدة ، استخدام BIGINT يوفر عليك هذه المشقة
استخدام VARCHAR بدل TINYINT
TINYINT تقوم بتخزين البيانات في بايت واحد ، اما VARCHAR فتقوم بتخزين البيانات بإضافة بايت واحد ، اي بدل واحد بايت سيكون 2 بايت ، لذا TINYINT افضل
هذا ما لدي وارجو ان يكون قد اجبت على استفساراتك بالشكل المطلوب
وأخيراً ، فإن أصبت فمن الله وإن أخطأت فمن نفسي والشيطان
نسيت!
هذا ربط مفيد للمقارنة بين انواع الحقول وتخزين البيانات
http://dev.mysql.com/doc/refman/5.1/en/storage-requirements.html
هلا ديفو ،
انا وضعت رابط مانيوال mysql في المقال لانه ما في بعد ان تأخذ العلم من عند اهله :)
timestamp ، الصراحة انا افضل النوع datetime لكن ربما يكون timestamp افضل
هنا يوجد مقال اخر عن انواع الحقول وفيه معلومة اول مرة اعرفها :)
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
Pal Coder
موضوع في الوقت المناسب بالخصوص هناك العديد من الاشخاص يقومون مثلا بوضع حقل للعنوان ويكون text وتجدة 1000 حرف اظنه استهلاك زائد وكما اشرت اخي VARCHAR جيد في هذة الامور
UNSIGNED اغلب البرامج تفتقر اليها واولها MySmartBB وقد واجهت الاعضاء مشكلة في الرسائل الخاصة اصبحت -1 او -2 بالسالب لكن قمت بحلها في ذلك الوقت الخ….
وشكرا اخي مجددا
سلامات
Dev-ly.com
وعليكم السلام ورحمة الله وبركاته
الدرس وافي الشرح جزاك الله كل خير ،
استفدت كتير من المقارنة بين ال VARCHAR و بقية حقول القيم العددية
شكرا لك اخي العزيز وفى انتظار المزيد
السلام عليكم ورحمة الله وبركاته
شكرا ليك كتير أخى الكريم على التوضيح، لقد بينت لى أمور لم تكن فى ذهني
فجزاك الله خير
اهلا اخي Bruce
فعلا ، تحديد نوع الحقل بشكل صحيح وخصائصه سيفيدك كثيرا اثناء برمجة البرنامج
اخي Hawy_PHP
وجزاك خيرا ان شاء الله ، وما اكثر خبايا mysql :)
اخي عمرو فهمي ،
العفو ، وانا ايضا بفضل سؤالك قمت ببعض التجارب فادتني في اماكن اخرى
شكرا ً الف :)
بارك الله فيك … موضوع مهم جداً يغفل عنه الكثير ، عند تصميم قاعدة البيانات لأي برمجية فأن الالتزام بهذه التعليمات التي ذكرتها في نهاية المقال تساعد على التقليل من حجم قاعدة البيانات و بالتالي سهولة في العمل و النسخ الأحتياطي .
شكراً لك على هذا الشرح
لقد استفدت منه كثيراً