PDA

View Full Version : بهترن انواع داده برای ذخیره فیلدها



takavar_dez
دوشنبه 27 دی 1389, 11:51 صبح
با سلام

بهترین نوع داده برای ذخیره داده های زیر در SQLServer چیه؟

1. شماره ملی
2.مبلغ بر حسب ریال

حمیدرضاصادقیان
دوشنبه 27 دی 1389, 22:53 عصر
سلام.
برای شماره مل چون طولش ثابت هست بهتره از متغیرهای با طول ثابت استفاده کنید نه nvarchar . میتونید char(10) در نظر بگیرید.
چون int هم جواب نمیده. زیرا حداکثر مقدار قابل پذیرش در INT عدد 2,147,483,647 هست و عدد شماره ملی ممکنه از این بیشتر باشه.
این نوع هم میتونید از نوع Decimal با طول مثلا 13 رقم درنظر بگیرید بدون اعشار.

ASKaffash
سه شنبه 28 دی 1389, 08:29 صبح
با سلام

بهترین نوع داده برای ذخیره داده های زیر در SQLServer چیه؟

1. شماره ملی
2.مبلغ بر حسب ریال

سلام
برای هردو مورد از Bigint استفاده کنید چون اگر numeric(10,0) استفاده کنید برای کد ملی 9 بایت می شود ولی با Bigint مقدار 8 بایت فضا لازم است و صفرهای پشت کد ملی را خودتان مدیریت کنید

stabesh
سه شنبه 28 دی 1389, 09:38 صبح
سلام.
برای شماره مل چون طولش ثابت هست بهتره از متغیرهای با طول ثابت استفاده کنید نه nvarchar . میتونید char(10) در نظر بگیرید.
چون int هم جواب نمیده. زیرا حداکثر مقدار قابل پذیرش در INT عدد 2,147,483,647 هست و عدد شماره ملی ممکنه از این بیشتر باشه.
این نوع هم میتونید از نوع Decimal با طول مثلا 13 رقم درنظر بگیرید بدون اعشار.
با سلام و تشکر
اگه یک فیلد داشته باشم که از نوع char باشه و این فیلد بتونه null باشه اون وقت حافظه مورد استفاده به هدر میره اما اگه از نوع nvarchar باشه دیگه حافظه به هدر نمیره پس از لحاظ حافظه بهینه تره
من همیشه این طوری فکر میکردم :متفکر:
درسته فکرم ؟
متشکرم

stabesh
سه شنبه 28 دی 1389, 09:41 صبح
سلام
برای هردو مورد از Bigint استفاده کنید چون اگر numeric(10,0) استفاده کنید برای کد ملی 9 بایت می شود ولی با Bigint مقدار 8 بایت فضا لازم است و صفرهای پشت کد ملی را خودتان مدیریت کنید
با سلام و تشکر
فرق bigint و decimal در جیه ؟

ASKaffash
سه شنبه 28 دی 1389, 12:49 عصر
سلام
Bigint فقط عدد صحیح است و در حدود 19 رقم ظرفیت دارد و 8 بایت اشغال میکند ولی numeric برای اعشاری عموما استفاده می شود و متناسب با سایز درخواستی ظرفیت متفاوت دارد

tooraj_azizi_1035
سه شنبه 28 دی 1389, 15:42 عصر
سلام،
عملیات رابطه ای و محاسباتی روی فیلد های عددی سریعتر از رشته ای است. وقتی کد ملی رو ایندکس می کنید و SQL Server برای اون B-tree درست می کنه در هنگام مقایسه مقادیر برای یافتن یک کد ملی خاص در درخت ساخته شده این قضیه خودش رو نشون می ده.
برای نوع مبلغ هم money رو انتخاب کن. رنج مقادیر money :

-922,337,203,685,477.5808 to 922,337,203,685,477.5807

حمیدرضاصادقیان
سه شنبه 28 دی 1389, 20:33 عصر
البته نوعی که جناب کفاش پیشنهاد دادن بهتر هست.
در مورد char ,nvarchar هم عرض کنم نوع مکانی که این نوع فیلدها در page ها ذخیره می شوند باهم متفاوت هست .و نوع ایندکس گذاری روی انها نیز تفاوت دارد.

tooraj_azizi_1035
چهارشنبه 29 دی 1389, 10:11 صبح
در رابطه با اینکه گفتم نوع داده ای Bigint رو برای کد ملی انتخاب کنید باید بگم شما نمی تونید صفر رو پشت عدد ذخیره کنید. فرض کنید دو کد ملی زیر را داریم:
0012457775 0125454776
صفرهای پشت عدد در فیلد ذخیره نمی شوند شما باید در هنگام نمایش مقدار در Application تان تعداد ارقام را از 10 کم کنید و به همان اندازه پشت عدد 0 قرار دهید. البته می توانید نوع Char(10) را انتخاب کنید اما من به خاطر اینکه عملیات جستجو روی فیلد عددی سریعتر از فیلد رشته ای است نوع Bigint را پیشنهاد کردم.

ASKaffash
چهارشنبه 29 دی 1389, 11:56 صبح
در رابطه با اینکه گفتم نوع داده ای Bigint رو برای کد ملی انتخاب کنید باید بگم شما نمی تونید صفر رو پشت عدد ذخیره کنید. فرض کنید دو کد ملی زیر را داریم:
0012457775 0125454776
صفرهای پشت عدد در فیلد ذخیره نمی شوند شما باید در هنگام نمایش مقدار در Application تان تعداد ارقام را از 10 کم کنید و به همان اندازه پشت عدد 0 قرار دهید. البته می توانید نوع Char(10) را انتخاب کنید اما من به خاطر اینکه عملیات جستجو روی فیلد عددی سریعتر از فیلد رشته ای است نوع Bigint را پیشنهاد کردم.

سلام
در لایه بانک اطلاعاتی هم می شود صفرهای پشت کد ملی را هندل کرد

ASKaffash
چهارشنبه 29 دی 1389, 12:12 عصر
سلام
یک روش از استفاده از فیلد محاسباتی است :


-----------------
CREATE Function Zero(@N Bigint,@L Tinyint)
Returns VarChar(255) As
Begin
Return Right(Replicate('0',20)+Convert(Varchar(20),IsNull (@N,0)),@L)
End
-----------------
Create Table T
(
MainMC Bigint,
ShowMC As dbo.Zero(MainMC,10)
)
-----------------
Select * From T

اینهم نتیجه خروجی :
65258

takavar_dez
دوشنبه 04 بهمن 1389, 11:18 صبح
سلام
برای هردو مورد از Bigint استفاده کنید چون اگر numeric(10,0) استفاده کنید برای کد ملی 9 بایت می شود ولی با Bigint مقدار 8 بایت فضا لازم است و صفرهای پشت کد ملی را خودتان مدیریت کنید

با سلام و تشکر
بله استفاده از Bigint به دلایلی که فرمودید مناسب است اما هنگامی که از جداول دارای این فیلد با کریستال گزارش بگیریم بعد از 10 رقم شماره ملی ممیز و بعد از آن دو صفر را نمایش می دهد که مطلوب نیست!
راه حل این مساله چیست؟

ASKaffash
دوشنبه 04 بهمن 1389, 13:13 عصر
سلام
فرمت فیلد مجازی بنام ShowMC ازنوع کارکتری است و اعشاری نیست