PDA

View Full Version : سوال: مشکل خیلی عجیب در ذخیره کلمات فارسی در بانک



ali9698
پنج شنبه 11 آبان 1391, 22:46 عصر
سلام یه مشکل تقریبا عجیب دارم
توی سایتم کابر اسم خودش رو که فارسی تایپ میکنه بدون هیچ مشکلی توی بانک ذخیره میشه
بعد از ذخیره نیاز دارم که فیلد اسم کاربر رو با متن داخل یک textbox مقایسه کنم
جالب اینجاست که اگر کاربر توی اسمش حرف "ی" داشته باشه مثل "حسین" وقتی که توی بانک ذخیره میشه اگه با قبل از ذخیره مقایسه اش کنم مثل هم نیستن در صورتی که از نظر ظاهر کاملا یکی هستن، اما اگه حرف "ی" نداشته باشه هیچ مشکلی پیش نمیاد. فکر کنم sql server حرف "ی" رو تبدیل به حرف "ی" عربی میکنه که روی بعضی صفحه کلید ها (شیفت+ظ) رو که بزنی میاد.
لطفا کمک کنید:گریه:
collation رو هم توی تنظیمات بانک persian100_CL_AS گذاشتم
فیلدی که اسم کاربر رو ذخیره میکنه هم nvarchar

fakhravari
جمعه 12 آبان 1391, 00:36 صبح
آقای هاشمی نژاد یک dll داره برای تبدیل این موارد

ali9698
جمعه 12 آبان 1391, 01:31 صبح
ممنون. ولی هاشمی نژاد کی هست؟ این dll رو باید از کجا پیدا کنم؟!
راستی اصلا اگه پیدا کردم باید چی کارش کنم؟!

ایمان مدائنی
جمعه 12 آبان 1391, 01:40 صبح
در لینک زیر میتونی دانلود کنی

لینک (http://hasheminezhad.com/fixfarsichars)

ali9698
جمعه 12 آبان 1391, 01:56 صبح
هنوز تستش نکردم اما خیلی ازتون ممنونم. کمک بزرگی کردین

rezayeman
یک شنبه 14 آبان 1391, 10:02 صبح
سلام دوست عزیز جواب این سوال خیلی آسونه از حرف N استفاده کن مثل زیر. مطمئن باش مشکلت حل میشه

select username from [user]
where username like N'%عبارت جستجو%'

fakhravari
یک شنبه 14 آبان 1391, 20:19 عصر
کلا مشکل کالکشن دیتابیس دارید

ali9698
یک شنبه 14 آبان 1391, 23:43 عصر
اگه منظورتون collation هستش اون رو روی همه حالت های persian تست کردم ولی جواب نمیده

fakhravari
یک شنبه 14 آبان 1391, 23:55 عصر
قبلش داده ها را پاک کنید.
چه ورژنی دارید؟

ali9698
دوشنبه 15 آبان 1391, 00:11 صبح
داده ها رو پاک نکردم. اما بعد از هر بار که collation رو تغییر میدادم رکورد جدید ثبت میکردم ولی بازم نمیشد
sql server 2008 r2
visual studio 2010

ali9698
دوشنبه 15 آبان 1391, 00:13 صبح
اون توی سایت آقای هاشمی نژاد بود رو امتحان کردم. چرا ارور میده. اصلا نمیزاره صفحه لود بشه. به همون یه خط کد که توی تگ httpmodule توی فایل web.config مینویسم گیر میده.

ali9698
دوشنبه 15 آبان 1391, 00:26 صبح
آقای rezayeman
حرف N چی کار میکنه؟ یعنی جز دستورات sql حساب میشه؟!!!
علامت درصد رو هم باید بزارم؟! آخه هر کار کردم از این روش جواب نگرفتم
راستی با یه رشته ثابت نمیخوام مقایسه اش کنم. میخوام با مقدار داخل یه تکست باکس مقایسه اش کنم. اما جواب نمیگیرم:افسرده:

rezayeman
دوشنبه 15 آبان 1391, 11:05 صبح
حرف N باعث میشه مقایسه بدون مشکل انجام بشه. منم مشکل شمارو داشتم و با این روش حلش کردم. دنبال راه های دیگه نگرد مطمئنن از همین روش جواب میگیری. % مثل * توی سرچ ویندوز عمل میکنه مثلا وقتی مینویسی %re یعنی تمامی کلماتی که با re شروع میشه یا وقتی مینویسی %re% یعنی تمامی کلماتی که داخلش حروف re وجود داشته باشه. لازم نیست حتما از رشته ثابت استفاده کنی میتونی مقدار textbox رو براش ارسال کنی. به این صورت

string strQuery = "select username from [user] where username like N'%" + Textbox1.Text + "%'"

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

معمولا sql کلمات فارسی را در بانک بصورت حروف عربی ذخیره می کنه و واسه همین این مشکل ایجاد میشه و حرف N قبل کلمات مورد جستجو بمعنای unicode هستش و به sql اعلام میکنه که هنگام جستجو باید از طریق unicode عمل کنه.

فکر کنم اگه collation دیتابیس رو بر روی "Persion_100_CI_AS " یا "Arabic_CI_AS " تنظیم کنی هم مشکلت حل بشه.

امیدوارم کمکی کرده باشم

ali9698
دوشنبه 15 آبان 1391, 14:39 عصر
سلام دوست عزیز
ممنون که اینقدر کامل توضیح دادی. من هم کامل متوجه شدم. اما مشکلم حل نشده! دقیقا عین کدی که نوشتی رو هم نوشتم ولی جواب نگرفتم. دقیقا مثل قبل هستش
خودت که جواب گرفتی بانک رو به چه ورژنی ساختی؟ ویژوال استودیو چند رو نصب کرده بودی؟ نوع فیلدت چی بود؟ collation بانکت چی بود؟
من از اینا استفاده میکنم
sql server 2008 R2
visual studio2010
نوع فیلد: nvarchar(20)
collation: persian_100_ CI_AS
البته بقیه persian ها رو هم تست کردم. جواب نداد!!!

ali9698
دوشنبه 15 آبان 1391, 15:12 عصر
آقای fakhravar اون dll رو خودتون تست کردین؟ جواب میده؟ من به اون کدی که باید توی تگ httmmodule بنویسم گیر میده. البته نه خود ویژوال استودیو، مرورگر وقتی که میخواد اجرا کنه گیر میده!

rezayeman
دوشنبه 15 آبان 1391, 15:24 عصر
سلام علی جان

من از

sql server 2005
visual studio 2008
نوع فیلد nvarchar
collation = Arabic_CI_AS

استفاده می کنم

وقتی collation رو تغییر میدی داده های قبلیو پاک کن و چند تا جدید وارد کن و دوباره امتحان کن

ali9698
سه شنبه 16 آبان 1391, 01:56 صبح
درست شد بالاخره
هوراااااااا
بالاخره با همون حرف N درست شد دوست عزیز
اما یادت رفت که بهم بگی موقع ثبت اطلاعات توی بانک هم باید از این حرف استفاده کنم.
منم اینطوری استفاده کردم حل شد
SqlCommand cmd = new SqlCommand("", con);
con.Open();
cmd.CommandText = "Insert Into tbl1(email) Values('" + textbox_email.Text + "'")";
cmd.ExecuteNonQuery();

cmd.CommandText = "UPDATE tbl1 SET name=N'" + textbox_name.Text + "' WHERE( email='" + textbox_email.Text + "')";
cmd.ExecuteNonQuery();

cmd.CommandText = "SELECT name FROM [tbl1] WHERE name like N'" + textbox_name.Text + "'";
cmd.ExecuteNonQuery();
con.Close();

fakhravari
سه شنبه 16 آبان 1391, 02:42 صبح
آقای fakhravar اون dll رو خودتون تست کردین؟ جواب میده؟ من به اون کدی که باید توی تگ httmmodule بنویسم گیر میده. البته نه خود ویژوال استودیو، مرورگر وقتی که میخواد اجرا کنه گیر میده!
تست شده و 100% کار می کنه.
در مورد دستور Insert هم
مقادیرتو در قالب پارامتر بده در SqlCommand
اگر
نوع فیلد nvarchar
collation = Arabic_CI_AS
باشه مقادیر به این صورت ؟؟؟؟؟؟ در نمی اید.

rezayeman
سه شنبه 16 آبان 1391, 08:55 صبح
خدارو شکر که درست شد
اما من موقع ثبت حرف N نزاشتم

fakhravari
سه شنبه 16 آبان 1391, 10:49 صبح
در کل دیتابیست مشکل داره ها !!!!!!!

rana-writes
سه شنبه 16 آبان 1391, 12:28 عصر
سلام
به جاي اينكه از دستورات sql اينطوري مستقيم توي برنامه استفاده كنين كه هم از لحاظ امنيتي مشكل داره، هم اين مشكلات رو به وجود مياره از stored procedure و ارسال به شكل پارامتر استفاده كنين

موفق باشين

rezayeman
سه شنبه 16 آبان 1391, 16:17 عصر
آقا یا خانم rana-writes

اتفاقا از Stored Procedure استفاده کردم در پروژه خودم اما بازم این مشکل بود و من همین طریق حلش کردم.

saeed_sho
سه شنبه 16 آبان 1391, 17:53 عصر
شما باید هم موقع insert و هم آپدیت از N استفاده کنید البته در استورد پروسیجر لازم نیست

راستی من collation دیتابیسم همون پیش فرضه و مشکلی هم ندارم