# پایگاه‌های داده > سایر پایگاه‌های داده > MySQL > سوال: نوع داده فیلد ها در mysql یا phpmyadmin

## HTayebi

با سلام و احترام

 درون انجمن جستجویی هم انجام دادم اما  نتیجه ای نگرفتم چون سوالم مبهم و جوابی مبهم دارد. اینجا ذکر می کنم. با تشکر از مدیران انجمن و دوستانی که در این تاپیک به حقیر کمک می کنند.

 در رابطه با تنظیمات نوع داده برای فیلد  هایی که درون جداول دیتابیس تولید می کنیم ابهاماتی همیشه داشته ام که  نیاز به راهنمایی دارم . 

 فرض کنید قصد دارید دیتابیسی تولید کنید با جداول و فیلد های زیر 




users
-------------
user_id
user_login
user_password

-------------
courses
-------------
course_id
course_name
-------------
user_courses
-------------
user_course_id
user_course_singup_date
-------------
files
-------------
file_id
orginal_file_name
fake_file_name
course_id
course_part_file
orginal_file_created_date
fake_file_crated_date 
expire_time_for_fake_file_name






اولین عبارت بین هر ---------- نام جدول و عبارت بعدی فیلد های آن جدول می باشد فرض مثال جدول کاربران سه فیلد داریم با نام های




user_id
user_login
user_password



حالا سوال اینجاست که برای فیلد اول از  چه نوع داده ای با چه اندازه ای باید استفاده شود برای فیلد دوم که قرار  هست کاراکتر های عددی آندرلاین و عبارات حروفی بزرگ و کوچک لاتین بگیرد از  چه نوعی باید استفاده شود برای این فیلد از مقدار صحبتی نمی کنم که در خطوط  پایین توضیح بیشتری میدهم. 
 برای فیلد پسورد از چه نوع داده ای باید  استفاده شود ؟ این فیلد قرار هست مقادیری که درون برنامه به صورت عدد حروف  و کاراکتر های غیر مجاز توسط کاربر به عنوان پسورد درج می شود را به صورت  md5 یا هش شده دریافت کند برای این فیلد از چه نوع داده ای و با چه مقداری  باید استفاده شود با شرط بر اینکه قرار باشد مقدار درون فیلد به صورت هش  شده md5 باشد .


چیزی که هست بچه های رشته کامپیوتر  بیشتر با انواع حافظه در رایانه آشنایی داشته و حتی شاید انواع داده ها را  از حفظ باشند اما مسئله اینجاست که برای حقیر هیچ وقت این طور نبوده و پاره  ای از ابهامات باعث میشده تا در هنگام ایجاد دیتابیس این موارد را به علت  نداشتن دانش کافی رعایت نکنم.

همانطور که میدانید هر ییت کوچک‌ترین واحد حافظه ‌است که فقط دو مقدار صفر (۰) یا یک (۱) را می‌توان در آن ذخیره کرد.
 و هر 8 بیت برار هست با یک بایت
 هر کاراکتر 1 بایت از حافظه رایانه ما  یا رایانه سروری که برنامه ما در آن اجرا شده را اشغال می کند که اگر حافظه  رم رایانه ما یا سرور 1024 مگابایت باشد یعنی مقدار فوق العاده زیاد هنوز  آزاد و در دسترس و قابل بهره برداری و استفاده می باشد. 

با این حساب اگر قرار باشد در فیلد user_id جدول کاربران مقدار عددی قرار بگیرد چون ما از تعداد کاربران خود در آینده مطلع نیستیم :
 از چه مقداری به عنوان طول کاراکتر های این فیلد باید استفاده شود ؟ 
 در انتخاب نوع داده چه نوع داده ای برای پردازش بهتر و پاسخگویی سریع تر مناسب می باشد ؟ 
 انتخاب نوع داده چه تاثیری در مصرف فضای دیتابیس دارد ؟ 

بیشتر که خواسته باشم بپرسم یا درواقع  باعث توضیحات بیشتر شوم برای اینکه این مطلب به عنوان یک منبع مفید برای  انتخاب نوع داده در طراحی دیتابیس باشد :

در بعضی از اسکریپت ها و برنامه ها  مشاهده می شود که از نوعی داده برای فیلد خاصی استفاده شده و مقدار آن را  براربر با 255 قرار داده اند آیا این 255 یعنی 255 کاراکتر امکان درج در  این فیلد وجود دارد ؟ 

و اگر این طور می باشد وقتی که کاربر  مقداری را درج می کند که کمتر از 255 کاراکتر می باشد و ما در تنظیمات  مقدار آن فیلد از عدد 255 استفاده کرده باشیم مقدار فضای اشغال شده به  واسطه تنظیمی که ما انجام دادیم ولو اینکه کاربر 10 کاراکتر وارد کرده باشد  باز هم به اندازه 255 کاراکتر فضا را اشغال خواهد کرد و این مقدار را از  حافظه رم دستگاه استفاده خواهد کرد ؟ 

یعنی 255 بایت از حافظه اشغال شده در  صورتی که کاربر ما به اندازه 10 بایت نیاز داشته و به اندازه همون 10 بایت  مصرف کرده و اگر ما این روال را رعایت نکنیم باعث می شود که میزان فشار به  منابع سرور در برنامه های بزرگتر بیشتر شده و این مسئله نیازمند هزینه های  بیشتری خواهد شد که توجیه اقتصادی ندارد.


در رابطه با فیلد user_login و  user_password مشاهده می شود افرادی این فیلد ها را برابر با نوع varchar   یا text قرار میدهند فرضا ما قصد داریم کاربر ما عددی برای عضویت نام  کاربری که وارد می کند دارای کاراکتر های حروف بزرگ و کوچک لاتین عدد و  آندرلاین بوده و نهایت 8 عبارت یا کاراکتر بیشتر نباشد :
 اگر در انتخاب نوع داده از varchar  استفاده شود برای اینکه قصد داریم بیشتر از 8 کاراکتر درون دیتابیس استفاده  نشود مقدار این فیلد به چه شکلی باید تنظیم شود 
 اگر نوع  فیلد را text قرار دادیم مقدار  باید به چه شکلی تنظیم شود چون قصد ما دریافت فقط 8 کاراکتر از کاربر به  عنوان نام کاربری وی می باشد ؟
 اگر نوع فیلد به صورت char قرار گرفت مقدار به چه شکلی تنظیم می شود ؟ 



فرضا نوع داده برای فیلد نام کاربری char قرار گرفت و مقدار آن 8 به این شکل چه مقدار از حافظه رم اشغال می شود ؟ 
 فرضا نوع داده برای فیلد نام کاربری varchar قرار گرفت و مقدار آن 8 به این شکل چه مقدار از حافظه رم اشغال می شود ؟ 
 فرضا نوع داده برای فیلد نام کاربری text قرار گرفت و مقدار آن 8 به این شکل چه مقدار از حافظه رم اشغال می شود ؟ 

تفاوت نوع داده باینری با char و varchar در چیست؟
 اگر خواسته باشیم برای فیلد رمز عبور از نوع باینری استفاده کنیم به جای استفاده از char یا varchar چه تاثیری دارد ؟

در رابطه با تاریخ چه نوع داده ای باید  انتخاب شود ؟ فکر کنید مطلبی را توسط برنامه ای که نوشته ایم درج می کنیم  قصد داریم تاریخ فقط تاریخ را در لحضه درج برنامه در فیلدی درون دیتابیس  ذخیره کنیم و بعد درون نوشته های وب سایتمان آن تاریخ را نمایش دهیم اینجا  از چه نوع داده ای باید استفاده شود؟ 
 آیا در نوع داده ای که به تاریخ ارتباط دارد باید مقدار *Length* درج شود ؟ 

اگر قصد داشته باشیم هم ساعت و هم تاریخ درون فیلد درج شود چه نوعی کاربرد دارد ؟ و آیا باید *Length * درج شود ؟ 


اگر فیلد ID یک جدول نوعش INT باشد و  مقدارش فرضا 11 یعنی طول این فیلد تا 11 کاراکتر یا در واقع 11 عدد مجاز می  باشد درسته یعنی این مقدار میتواند داخل فیلد درج شود: 99999999999

 اگر BiGINT باشد و عبارت 11 درون طول قرار بگیرد به چه شکل خواهد بود ؟ چه تعداد کاراکتر درون این فیلد قابلیت ذخیره سازی دارد ؟ 


در مورد فیلد password چون قرار هست 32  کاراکتر درون فیلد درج شود آن هم صرفا این 32 کاراکتر ، کاراکتر هایی می  باشد که توسط تابع md5 تولید شده نوع جدول char با طول 32 باشد مشکل ساز  خواهد بود ؟ اگر خیر چرا افراد از varchar  با طول های متفاوت استفاده می  کنند یا از انواع دیگر داده.


*درون  phpmyadmin برای نمونه جدولی درست کردم و برای آن جدول یک فیلد با نام ID  ایجاد کردم نوع داده INT و با طول 10 بعد از تولید فیلد رفتم برای درج  اولین مقدار داخل این فیلد زمانی که عبارت عددی 99999999999 را وارد کردم  که ببینم این تعداد کاراکتر را میگیرد یعنی 11 کاراکتر چه خطایی میگیرم  خطایی مبنی بر پیام زیر را دریافت کردم 
** Please  enter a value less than or equal to 2147483647 حال مسئله ای که وجود  دارد این می باشد که اگر ما تا 10 کاراکتر توانایی درج مقدار درون این فیلد  را داریم و نوع این فیلد عددی می باشد و فقط عدد دریافت خواهد کرد این  درخواستی که کرده دقیقا چه مفهومی دارد ؟* *Please enter a value less than or equal to 2147483647 درک این مسئله برای من سخت می باشد.*

*برای نمونه  این فیلد را مورد اصلاح قرار داده و طول ID را برابر با 1 و حتی0  قرار  دادم که خودش اتوماتیک به11 تبدیلش کرد !!!!!!!  و نوع آن را برابر با INT  قرار دادم این آزمایش را درون phpmyadmin انجام میدادم پس از ذخیره اقدام  به درج مقدار جدیدی کردم و مقدار وارد شده عددی 10 رقمی بود مگر این جا این  10 رقم به منزله 10 کاراکتر محسوب نمی شود چرا بدون هیچ مشکلی رقم به این  طولانی 2147483647 بدون مشکل درج شد.
اگر واقعا هیچ فرقی بین وارد کردن 1 یا 10 یا 100 نیست چرا باید مثل  دیتابیس سایر برنامه ها که معمولا برای فیلد ID از نوع int و طول 11  استفاده می کنند ما نیز از 11 استفاده کنیم برای طول این فیلد ؟؟؟؟؟
*






درون دیتابیس مدیریت محتوای وردپرس   جدولی وجود دارد با نام users که فیلد های این جدول و ساختار کلی فیلد های  این جدول به شکل زیر می باشد







users
==============
Name            Type        Collation        Attributes    Null        Default

ID              bigint(20)                UNSIGNED    No        None
user_login         varchar(60)    utf8mb4_unicode_ci            No
user_pass        varchar(255)    utf8mb4_unicode_ci            No
user_nicename         varchar(50)    utf8mb4_unicode_ci            No
user_email        varchar(100)    utf8mb4_unicode_ci            No
user_url        varchar(100)    utf8mb4_unicode_ci            No
user_registered        datetime                        No        0000-00-00 00:00:00
user_activation_key    varchar(255)    utf8mb4_unicode_ci            No
user_status        int(11)                            No        0
display_name        varchar(250)    utf8mb4_unicode_ci            No







با توجه به اینکه برای id از نوع bigint و طول 20 استفاده شده دلیل استفاده از این نوع داده و این طول چیست ؟ 
 برای سایر فیلد ها به غیر از  user_registered و user_status از varchar استفاده کرده است و با طول های  متفاوت که به عنوان نمونه اگر عبارت زیر 

varchar(255) که برای user_pass در نظر  گرفته شده به معنای درج 255 کاراکتر درون این فیلد باشد در صورتی که کاربر  ما نهایت 10 کاراکتر بیشتر وارد نخواهد کرد یا نهایت بیشتر از 20 کاراکتر  وارد نخواهد کرد چرا باید 255 کاراکتر در نظر گرفته شود ؟
 اگر این مقدار در نظر گرفته شود و این  عبارت 255 به منزله قبول 255 کاراکتر برای این فیلد باشد و کاربر فقط 10  کاراکتر استفاده کرده باشد 245 کاراکتری که استفاده نکرده آیا باعث اشغال  فضا و فشار مضاعف به سرور نخواهد شد ؟

در رابطه با user_status از نوع int  با  طول 11 استفاده شده که باز هم اگر 11 به منزله 11 کاراکتر قابل استفاده در  این فیلد باشد باتوجه به اینکه
*user_status*  – در نسخه های قبل وردپرس ۳.۰ برای مشخص کردن یک کاربر به عنوان اسپمر  استفاده می شد و یا عدد 0 و یا 1 خواهد بود که 0 به منزله اسپمر نبودن و 1  به منزله اسپمر بودن بود چرا باید از طول 11 و نوع int استفاده شود ؟ باز  هم اگر 11 به منزله تعداد کاراکتر مجاز باشد چرا باید برای یک مقدار تک  کاراکتری 0 وشاید  1 -  11 تنظیم شود که باعث شویم 10 بایت بیشتر از مقدار  رم سرور را استفاده کنیم ؟ 


کاربرد UNSIGNED    در بخش اتریبیوت چیست ؟ 

در فیلد user_registered از نوع datetime استفاده شده این نوع به چه شکلی عمل می کند ؟




*در  پایان همه صحبت هایی که کردم و هی تکرار کردم مقدار رم سرور منظورم این می  باشد که فرضا همین user_status که یک عبارت تک کاراکتری بیشتر نیست وقتی  11 درج می شود حالا چه از فضای هارد استفاده کند برای ذخیره داده ها و چه  از فضای رم استفاده کند برای ارائه پاسخ به کوئری های اجرا شده آیا به این  شکل مقدار دهی به طول فیلد ها باعث نمی شود مصرف منابع بیشتر شود ؟ و در  صورتی که منابع نا کافی باشد فشار بیشتری در برنامه های بزرگی مثل وردپرس  به سرور وارد شود ؟*

تمام سوالاتی که مطرح شد و حساسیتی که  بنده روی این مسئله دارم رفع نواقصی که به علت نداشتن تجربه داریم در زمان  طراحی دیتابیس آیا باعث بهبود سرعت اجرای کوئری ها  و بازدهی بهتر و افزایش  سرعت سایت نخواهد شد ؟ 

در پایان سوالات و توضیحات از تمام عزیزانی که در این تاپیک به حقیر کمکی هر چند اندازه ارزن کنند تشکر می کنم.

----------


## charcharkh

طراحی جدول چیزی نیست که با یکی دوتا تاپیک بشه راحت یاد گرفت پیشنهاد میدم به منابع خارجی مراجعه نمایید و شروع به کار عملی کنید یعنی بایست شروع به طراحی جدول کنید تا یواش یواش ککار دستتون بیاد

----------

