PDA

View Full Version : سوال: چرا حرف ی در سرچهای فارسی نمی آید



captain_black81
شنبه 28 اردیبهشت 1387, 12:49 عصر
سلام من یک برنامه نوشتم که اسامی فارسی رو در SQL جستجو می کنه.
اما اسامی که حرف ی دارند مثل حسین رو نمیاره حتی از Shift+X هم استفاده میکنم نمیاد
میشه کمک کنید

hozouri
شنبه 28 اردیبهشت 1387, 13:39 عصر
این کد رو امتحان کنید
Select * from tablename where fieldname =N'keysearch'
یا
Select * from tablename where fieldname like 'keysearch'

Himalaya
شنبه 28 اردیبهشت 1387, 13:41 عصر
یه بار هم اینو امتحان کنید . چون من هم این مشکلو داشتم با این کار حل شد
احتمالا تو sql نوع اون فیلد رو char انتخاب کردید ... تبدیلش کنید به varchar
البته اگه char تعریف کرده باشید هیچی موقع سرچ نباید پیدا کنه ... چون مثلا اگه
فیلدی رو char 50 تایی تعریف کرده باشیم و توی اون فیلد مثلا نوشته باشیم ali ،
فقط 3 کاراکتر وارد کردیم و بقیه اون رو به عنوان space میگیره
نتیجه اخلاقی اینکه واسه سرچ همچین خونه ای باید بنویسیم ali به همراه 47 تا space
اما varchar این مشکلو نداره ... امیدوارم حل بشه

hozouri
شنبه 28 اردیبهشت 1387, 13:50 عصر
char از unicode به خوبی پشتیبانی نمیکنه
ولی nvarchar به طوز کامل پشتیبانی میکمه karaji333 هم اشاره خوبی فرمودند

captain_black81
شنبه 28 اردیبهشت 1387, 14:29 عصر
ممنونم از توجهتون
من فیلدمو nvarchar گذاشتم همه سرچهام هم کار میکنه مثلا حسن دقیق میاد
فقط حرف ی مشکل داره

ASKaffash
شنبه 28 اردیبهشت 1387, 14:36 عصر
با سلام
احتمالا با حرف ک در مواردی نیز مشکل دارید برای حل این مشکل از تابع Replace در SQL مقادیر از این دست را شبیه سازی کنید بااین روشها حل شدنی نیست

captain_black81
شنبه 28 اردیبهشت 1387, 19:26 عصر
نامیدم نکنیدو، یکی کمک کنه

ASKaffash
یک شنبه 29 اردیبهشت 1387, 08:48 صبح
سلام
به کد ذیل نگاه کنید :
Declare @S nVarChar(100)
Set @S=N'حسيني'
حرف ی دونوع است.

captain_black81
یک شنبه 29 اردیبهشت 1387, 11:00 صبح
ممنونم مشکل حل شد..

mehran20_200
دوشنبه 17 فروردین 1388, 13:19 عصر
سلام دوست عزیز

میشه بگید چطوری این مشکل را حل کردید؟:عصبانی++:

newgoldenman
دوشنبه 17 فروردین 1388, 17:56 عصر
سلام دوست عزیز

میشه بگید چطوری این مشکل را حل کردید؟:عصبانی++:
سلام دوست عزیز
پست 2# همین تاپیك رو ببینید. اولین خط دستور راه حل این مشكله.

موفق باشید.

mehran20_200
سه شنبه 18 فروردین 1388, 00:41 صبح
سلام دوست عزیز
من در بانک اطلاعاتی دو مشتری دارم به نام های
ی
ي
ولی هر دستوری را تست می کنم تنها نام یکی را پیدا می کنه!


SELECT CustomersName AS Expr1, id AS Expr2
FROM dbo.Customers
WHERE (CustomersName = N'ی')

SELECT CustomersName AS Expr1, id AS Expr2
FROM dbo.Customers
WHERE (CustomersName LIKE 'ی')


در بانک اطلاعاتی هم دیگه نمی شه 'ی' های عربی را به فارسی تبدیل کنم چون بی نهایت فیلد و رکورد ذخیره شده.

با تشکر
منتظر هستم

mehran20_200
پنج شنبه 20 فروردین 1388, 23:54 عصر
یعنی از دوستان و اساتید کسی نیست که پاسخی برای این سوال داشته باشه؟:ناراحت:

afsharm
جمعه 21 فروردین 1388, 09:41 صبح
راه‌های زیادی هست. ولی قبل از خواندن آنها دقت کنید که در استاندارد یونیکد چندین و چند «ی» مختلف وجود دارد که سه تای آنها را ما بیشتر می‌شناسیم و بیشتر با آنها سر و کار داریم:
اول: «ی» فارسی که بدون نقطه است و چسبان. کد آن هم U+06CC است.
دوم: «ي» نقطه دار عربی که این هم چسبان است. کد آن هم U+064A است.
سوم: «ى» بدون نقطه عربی است که مشکل چسب دارد یعنی فقط به حروف قبل از خودش می‌چسبد. به عبارتی نمی‌توان از آن در وسط کلماتی مثل «حسین» استفاده کرد. کد این «ى» نچسب هم U+0649 است.
اگر در تشخیص انواع «ی» موجود در SQL Server یا ویندوز یا هرجای دیگری مشکل دارید می‌توانید از برنامه خیلی کوچکی که خودم مجبور شدم بنویسم و در کدپلکس قرار دهم استفاده کنید: http://fardis.codeplex.com/


و اما راه حل‌ها:
۱- اگر صرفا به دنبال یکی از «ی»ها می‌گردید، همان طور که query اولتان می‌گوید، یک راه خیلی ساده دارید:

SELECT CustomersName AS Expr1, id AS Expr2
FROM dbo.Customers
WHERE CustomersName in (N'ی' , N'ي', N'ى')
۲-اگر مورد جستجوی شما یک کلمه است نه یک حرف خالی، مجبور می‌شوید در Applicationتان کلمه مورد نظر را با همه ترکیبات مختلف «ی» تولید کنید و همه آنها را در عبارت where CustomerName in (n1, n2, n3, ...) قرار دهید. مثلا اگر قرار است کلمه «مهدی» را مورد جستجو قرار دهید اول باید در برنامه همه ترکیبات زیر را تولید کنید:
مهدی مهدي مهدى
سپس آن را در Query مطابق زیر قرار دهید:

SELECT CustomersName AS Expr1, id AS Expr2
FROM dbo.Customers
WHERE CustomersName in (N'مهدی', N'مهدي', N'مهدى')استفاده از علامت درصد (%) را هم در صورت لزوم فراموش نکنید.
۳- اگر دیتابیس‌تان پراکندگی زیادی نداشته باشد به احتمال زیاد فقط یک نوع «ی» در آن وجود دارد. نتیجتا قبل از ارسال هر نوع Query به دیتابیس همه «ی»های آن را با «ی» مورد استفاده در بانک اطلاعاتی عوض کنید. این کار هم با امکانات سی‌شارپ و هم با امکانات خود SQL قابل انجام است.
۴- می‌توانید یک کار متهورانه کرده و همه «ی»های دیتابیس را با آن «ی» که با آن راحت‌تر هستید عوض کنید. راه حل آن در اینجا (http://vahidnasiri.blogspot.com/2009/01/blog-post_13.html) گفته شده.

توصیه خیلی خیلی مهم:
سعی کنید در همه جا فقط از «ی» فارسی که هم چسبان است و هم بدون نقطه استفاده کنید. کد آن U+06CC است. تنها «ی» مختص زبان فارسی همین «ی» است. اگر صفحه کلید نصب روی ویندوز ایکس‌پی، ۲۰۰۰، ۲۰۰۳ یا ویندوز ویستای شما قادر به وارد کردن «ی» فارسی نیست آن را با نصب صفحه کلید استاندارد سازمان استاندارد یعنی ۹۱۴۷ (http://prdownloads.sourceforge.net/farsitools/persiankeyboard.zip?download)مجبور به انجام این کار کنید! نسخه قدیمی‌تر این استاندارد ۲۹۰۱ بوده که البته نسخه جدیدتر تفاوت خیلی بنیادینی با آنه ندارد.

mehran20_200
شنبه 22 فروردین 1388, 00:25 صبح
واقعا ممنونم:چشمک::تشویق:

Happy_davood
شنبه 22 فروردین 1388, 07:52 صبح
یک کار اساسی دیگه هم میشه کرد که دیگه نگران سیستم عاملی که برنامه روش نصب شده نباشید .
یه کنترل TextBox از روی کنترل TextBox مشتق کنید و در وقفه KeyPress همه ي ها رو به ی تبدیل کنید .
یعنی اینکه کاربر هیچ وقت نتونه ي رو وارد بانک اطلاعاتی یا هر جای برنامه بکنه .
این کار رو میشه روی فرم هم انجام داد تا نزاره کاراکتر های ناجور وارد برنامه بشند . ولی درست کردن یه کنترل TextBox هم بدک نیست . اینجوری خیالتون همیشه راحته .

ضمناً به غیر از ی بعضی کاراکتر های دیگه هم هستند که مشکل دارند مثل ک یا ه !