حل شده

نوع داده فیلد ها در mysql یا phpmyadmin

بازدید67.2kپست ها1آخرین فعالیت5 سال پیش
1
3

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

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 درج می شود حالا چه از فضای هارد استفاده کند برای ذخیره داده ها و چه از فضای رم استفاده کند برای ارائه پاسخ به کوئری های اجرا شده آیا به این شکل مقدار دهی به طول فیلد ها باعث نمی شود مصرف منابع بیشتر شود ؟ و در صورتی که منابع نا کافی باشد فشار بیشتری در برنامه های بزرگی مثل وردپرس به سرور وارد شود ؟

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

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

سلام.قربان خوش امدید. سوالتون چقدر طولانیه ای کاش تقسیمش میکردین به چند تا سوال کوچیکتر. – کیوان سمیعی 5 سال پیش
جواب خیلی ز سوال ها با خوندن یه مقدمه از mySql حل میشه پیشنهاد میکنم حتما اینکارو بکنید – کیوان سمیعی 5 سال پیش

1 پاسخ

1

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

اول از همه چیزی که باید بهش توجه کنید اینه که نیازی نیست شما بیاین دقیقا بایت به بایت رو محاسبه کنید نمیتونه خیلی تاثیری داشته باشه. اگر اینقدر دقیق اطلاعات میخواین باید مستندات دیتابیس مربوطه رو مطالعه کنید. یکسری از مواردی که گفتین (مثل تخصیص حافظه) حتی در موتورهای مختلف هم با هم فرق دارن چه برسه به دیتابیس.
در اکثر موارد دیده میشه فیلد پسورد رو از نوع varchar با طول ۲۵۵ کاراکتر میذارن. در صورتی که معمولا طول پسوردی که هش شده خیلی کمتر از ۲۵۵ کاراکتر هست. اما چون داده از نوع رشته هست باید varchar باشه.

ببینید خیلی از مواردی که گفتید کاملا بسته به شرایط میتونه متفاوت باشه. یعنی اینکه نوع داده چی باشه و طولش چقدر باشه unsigned با شه یا نباشه به شرایط و نیازهای شما بستگی داره. برای مثال فیلد پسورد بستگی به الگوریتم هش داره که طولش چقدر باشه (البته برای هش کردن پسورد امروزه از md5 استفاده نمیشه).

بهترین کار اینه که ببینید برنامه نویس های حرفه ای چی کار کردن. مثلا این ساختار جدولیه که خود لاراول برای جدول کاربرها میسازه:

<br> > در بعضی از اسکریپت ها و برنامه ها مشاهده می شود که از نوعی داده برای فیلد خاصی استفاده شده و مقدار آن را براربر با 255 قرار داده اند آیا این 255 یعنی 255 کاراکتر امکان درج در این فیلد وجود دارد ؟ <br> بله <br> > و اگر این طور می باشد وقتی که کاربر مقداری را درج می کند که کمتر از 255 کاراکتر می باشد و ما در تنظیمات مقدار آن فیلد از عدد 255 استفاده کرده باشیم مقدار فضای اشغال شده به واسطه تنظیمی که ما انجام دادیم ولو اینکه کاربر 10 کاراکتر وارد کرده باشد باز هم به اندازه 255 کاراکتر فضا را اشغال خواهد کرد و این مقدار را از حافظه رم دستگاه استفاده خواهد کرد ؟ <br> برای char بله در هر صورت به همون اندازه که تعیین کردید جا اشتفال میشه اما varchar اینطور نیست، به همون اندازه که متن توش وجود داره جا اشغال میکنه. تفاوت اینا هم همینه <br> > در رابطه با فیلد user_login و user_password مشاهده می شود افرادی این فیلد ها را برابر با نوع varchar یا text قرار میدهند فرضا ما قصد داریم کاربر ما عددی برای عضویت نام کاربری که وارد می کند دارای کاراکتر های حروف بزرگ و کوچک لاتین عدد و آندرلاین بوده و نهایت 8 عبارت یا کاراکتر بیشتر نباشد : اگر در انتخاب نوع داده از varchar استفاده شود برای اینکه قصد داریم بیشتر از 8 کاراکتر درون دیتابیس استفاده نشود مقدار این فیلد به چه شکلی باید تنظیم شود اگر نوع فیلد را text قرار دادیم مقدار باید به چه شکلی تنظیم شود چون قصد ما دریافت فقط 8 کاراکتر از کاربر به عنوان نام کاربری وی می باشد ؟ اگر نوع فیلد به صورت char قرار گرفت مقدار به چه شکلی تنظیم می شود ؟ <br> فیلد پسورد رو همیشه روی varchar تنظیم میکنن.من ندیم کسی text بذاره. در مورد char هم که توضیح دادم <br> > در رابطه با تاریخ چه نوع داده ای باید انتخاب شود ؟ فکر کنید مطلبی را توسط برنامه ای که نوشته ایم درج می کنیم قصد داریم تاریخ فقط تاریخ را در لحضه درج برنامه در فیلدی درون دیتابیس ذخیره کنیم و بعد درون نوشته های وب سایتمان آن تاریخ را نمایش دهیم اینجا از چه نوع داده ای باید استفاده شود؟ آیا در نوع داده ای که به تاریخ ارتباط دارد باید مقدار Length درج شود ؟ اگر قصد داشته باشیم هم ساعت و هم تاریخ درون فیلد درج شود چه نوعی کاربرد دارد ؟ و آیا باید Length درج شود ؟ <br> بازم بستگی داره شما تاریخ رو به چه شکلی میخواین ذخیره کنید. معمولا از نوع TIMESTAMP یا DATETIME یا INT میذارن. برای نوع دادهای TIMESTAMP و DATETIME اصلا نمیشه Length تعیین کرد. <br> > اگر فیلد ID یک جدول نوعش INT باشد و مقدارش فرضا 11 یعنی طول این فیلد تا 11 کاراکتر یا در واقع 11 عدد مجاز می باشد درسته یعنی این مقدار میتواند داخل فیلد درج شود: 99999999999 اگر BiGINT باشد و عبارت 11 درون طول قرار بگیرد به چه شکل خواهد بود ؟ چه تعداد کاراکتر درون این فیلد قابلیت ذخیره سازی دارد ؟ <br> نوع داده ای INT در هر صورت 4 بایت اشتغال میکنه و BIGINT در هر صورت 8 بایت. اون مقدار Lenght برای برای نمایش صفرهاست در حالت Zerofill. تو لینک پایین میتونید بیشتر در موردش بخونید [Integer Types (Exact Value)](https://dev.mysql.com/doc/refman/5.5/en/integer-types.html) <br> > در مورد فیلد password چون قرار هست 32 کاراکتر درون فیلد درج شود آن هم صرفا این 32 کاراکتر ، کاراکتر هایی می باشد که توسط تابع md5 تولید شده نوع جدول char با طول 32 باشد مشکل ساز خواهد بود ؟ اگر خیر چرا افراد از varchar با طول های متفاوت استفاده می کنند یا از انواع دیگر داده. <br> فیلد پسورد معمولا varchar انتخاب میشه با طول ۲۵۵ که قبلا توضیح دادم.

یکسری سوالات در این بین هست که فکر میکنم جواب همه داده شد

<br> > کاربرد UNSIGNED در بخش اتریبیوت چیست ؟ <br> UNSIGNED به این معناست که نمیشه مقدار منفی توش گذاشت. <br> > در فیلد user_registered از نوع datetime استفاده شده این نوع به چه شکلی عمل می کند ؟ <br> فرمت DATETIME به این صورته: YYYY-MM-DD HH:MM:SS که بازم بستگی داره شما به چه شکلی میخواین تاریخ رو ذخیره کنید. اطلاعات بیشتر: [MySQL DATE](https://dev.mysql.com/doc/refman/8.0/en/datetime.html) <br> > تمام سوالاتی که مطرح شد و حساسیتی که بنده روی این مسئله دارم رفع نواقصی که به علت نداشتن تجربه داریم در زمان طراحی دیتابیس آیا باعث بهبود سرعت اجرای کوئری ها و بازدهی بهتر و افزایش سرعت سایت نخواهد شد ؟ <br> یکسری از موارد بخاطر عدم شناخت کافی شما از این دیتابیس هست. ببینید تا زمانی که مقیاس دیتابیس شما به ترابایت (شاید) نرسیده مطمين باشید این چیزا به اون اندازه که فکر میکنید مهم نیست. کافیه موارد کلی رو طبق مستندات رعایت کنید.
تشکر از لطف بی انتهای شما – htayebi 5 سال پیش
خواهش میکنم. لطفا اگر پاسخ رو دریافت کردید روی تیک بالا کلیک کنید :) – رضا رمضانپور 5 سال پیش

سوال برنامه نویسی دارید؟

ندونستن عیب نیست، نپرسیدن چرا!

خوش آمدید

برای طرح سوال، ایجاد بحث و فعالیت در سایت نیاز است ابتدا وارد حساب کاربری خود شوید. در صورتی که هنوز عضو سایت نیستید میتوانید در عرض تنها چند ثانیه ثبت نام کنید.