PDA

View Full Version : سوال: بهترین type برای ذخیره کد ملی افراد چیه؟



دلتنگ اسمان
شنبه 21 تیر 1393, 17:36 عصر
سلام
حقیقتش جستجو کردم اما جواب درستی نگرفتم.
کدملی افراد رو از چه نوعی ذخیره کنیم که هم سرعت جستجو بالا باشه و هم در جستجوی Like بتونیم جواب بگیریم . خصوصا اونهایی که اولشون با 0 یا 00 شروع میشه.
از نوع string بگیریم که حجم داده ها زیاد میشه. و اگه از نوع bigint بگیریم صفرهای اولش حذف میشه و موقع جستجوی like جواب نمیده. int هم که نمیشه چون بعضی از کدها مقدارش بیشتر از int خواهد بود.

us1234
شنبه 21 تیر 1393, 18:05 عصر
کد ملی یک رشته است که تمام کارکتر های آن عددی است .
طول ش هم همیشه ثابته
پس بهترین نوع varchar(10) می باشد
در خصوص لایک هم با نوع رشته ای مشکل خاصی نیست .

دلتنگ اسمان
شنبه 21 تیر 1393, 18:28 عصر
کد ملی یک رشته است که تمام کارکتر های آن عددی است .
طول ش هم همیشه ثابته
پس بهترین نوع varchar(10) می باشد
در خصوص لایک هم با نوع رشته ای مشکل خاصی نیست .

در این نوع هم تست کردم اما در بعضی کدها خطا میده. http://barnamenevis.org/showthread.php?460188-%D9%BE%DB%8C%D8%BA%D8%A7%D9%85-The-conversion-of-the-nvarchar-value-3980106195-overflowed-an-int-column

aghayex
شنبه 21 تیر 1393, 23:14 عصر
دوست عزیز کد ملی ها رو از نوع داده بالاتر از اینت در نظر بگیر چرا ؟ چون حجم ذخیره اون کمتر هست مثلا حجم 8 بایت بهتره از 80 باید ( 8 * 10 ) مشکلی که شما دارید کد ملی های که ابتداشون صفر هست که تا جایی من سراغ دارم کد ملی وجود نداره که ابتداش صفر باشه بر فرض که باشه می تونید موقع سلکت داده ها از دستور cast و تابع convert اس کیو ال این کارو انجام بدی و کد ملی رو به 10 رقم برسونی

Davidd
یک شنبه 22 تیر 1393, 08:23 صبح
كد ملي يه رشته با طول ثابت هست بنابراين بايد char(10) در نظر بگيري كه ميشه از Like هم استفاده كرد. در مورد سرعت، اگه كد ملي كليد اصلي باشه خود sql به صورت خودكار روي كليد اصلي ايندكس ميسازه و مشكل سرعت وجود نداره. اگه كليد اصلي نيست (كه بعيده) ميتوني خودت ايندكس بسازي.
منظور از string چيه؟ توي sql تايپ string نداريم و نكته بعد اينكه كد ملي با 10 كاركتر حجمي نميگيره. يك ميليون ركوردش با char(10) ميشه ده مگابايت!

مهرداد صفا
یک شنبه 22 تیر 1393, 12:26 عصر
سلام. طاعات قبول.
اولا که تفاوت چندانی از نظر حجم نخواهد داشت. شما اگر به صورت عددی ذخیره کنید باید از یک نوع 8 بایتی استفاده کنید در حالیکه اگر به صورت VarChar ذخیره کنید نیاز به 10 بایت فضا دارید.
ثانیا اساسا مواردی مثل کدملی و شماره تلفن و شماره بارکد و ... (که ماهیتا رشته ای از اعداد هستند و نه عدد، و عملیات ریاضی خاصی روی آنها صورت نمی گیرد)، بهتر است که به صورت رشته ذخیره شوند، در این حالت برای کوئری گرفتن و عملیات ویرایشی مختلف کارتون ساده تر خواهد بود.

دلتنگ اسمان
یک شنبه 22 تیر 1393, 15:57 عصر
ممنون از توجهتون.
پس این خطا برای چیه؟ خداییش یه نفر این رو با sql اجرا کنه ببینه چرا این خطا رو میده.
این کد اتصال به جدول :( کلید اصلی: کدملیه).

string nationalCode = textBox1.Text.Trim();
if (!IsValidNationalCode(nationalCode))
{
MessageBox.Show(" کد ملی صحیح نمی باشد");
return;
}

SqlConnection sqlconnection;
SqlCommand SqlCommand;
sqlconnection = new SqlConnection();
SqlCommand = new SqlCommand();
SqlCommand.Connection = sqlconnection;

sqlconnection.ConnectionString = "server=localhost;Integrated security=true;database=matab";

string sql = "SELECT codemelli from tb1 WHERE codemelli = " + nationalCode;

SqlCommand.CommandText = sql;

SqlDataAdapter sda = new SqlDataAdapter();
sda.SelectCommand = SqlCommand;
DataTable dt = new DataTable();
sda.Fill(dt);

sqlconnection.Close();


if (dt.Rows.Count == 0)
{
string nationalcod = textBox1.Text.Trim();
SqlCommand.CommandText = "INSERT INTO tb1 " + "(codemelli,name,family,fadername) " +

"VALUES(@codemelli , @name,@family,@fadername)";

SqlCommand.Parameters.AddWithValue("@codemelli", nationalCode);
SqlCommand.Parameters.AddWithValue("@name", textBox2.Text.Trim());
SqlCommand.Parameters.AddWithValue("@family", textBox3.Text.Trim());
SqlCommand.Parameters.AddWithValue("@fadername", textBox4.Text.Trim());

sqlconnection.Open();
SqlCommand.ExecuteNonQuery();
sqlconnection.Close();
}

این جدولم که ساده هم ساختم . در sql2008 :

id int Unchecked
codemelli nchar(12) Unchecked
name nchar(10) Checked
family nchar(10) Checked
fadername nchar(10) Checked
Unchecked

این هم متن خطا :
The conversion of the nvarchar value '05901322713 ' overflowed an int column.

البته این خطا زمانی رخ میده که کد ملی به صورت زیر ثبت میشه:
چندتا کد ملی که با صفر شروع میشه ثبت کنم و بعد یک یا چند تا کد ملی که با صفر شروع نمیشه ثبت کنم و دوباره کد ملی هایی که با صفر شروع میشن رو میخوام ثبت کنم خطا میده.
مثال :
0600133966
3980106195
0589918125

مهرداد صفا
یک شنبه 22 تیر 1393, 16:41 عصر
سلام.
مشکل اینجاست:


string sql = "SELECT codemelli from tb1 WHERE codemelli = " + nationalCode;

فرضا اگر مقدار "0371234567.." در متغیر nationalCode قرار داشته باشه، رشته sql به این صورت خواهد بود:


"SELECT codemelli from tb1 WHERE codemelli =037123456.."

در این حالت sqlServer توقع داره که 037123456.. نام یک ستون یا شی باشه.
در واقع شما باید مقدار nationalCode رو داخل کوتیشن قرار بدید:


"SELECT codemelli from tb1 WHERE codemelli ='"+nationalCode+"'"

البته استفاده از پارامتر ها بهتر و اصولی تر است.

دلتنگ اسمان
یک شنبه 22 تیر 1393, 16:59 عصر
ممنونم. دو روزه باهاش درگیر بودم