PDA

View Full Version : سوال: مشکل با حروف فارسی در SQL Server



homayoon_fara
شنبه 28 شهریور 1388, 09:09 صبح
سلام

از وقتی که من از دلفی 7 سوییچ کردم رو دلفی 2009 کماکان با این مشکل درگیر شدم.
اونم اینه که وقتی که query میگیرم ، 2008 sql server همه حروف فارسی رو پیدا می کنه الا حرف "ی فارسی" که کد یونیکدش 1740 هستش اما اگر به جای اون از "ي عربی" که کد یونیکدش 1610 هست استفاده کنم ، اونوقت تو query درست عمل می کنه.
بعد گفتم یه خورده دقیق تر عمل کنم ، رفتم از اینترنت و جدول یونیکد عربی و فارسی رو گرفتم. دیدم این مشکل (یعنی سرچ نشدن حروف توسط sql server) فقط مربوط به "ی فارسی" نمیشه و کرکتر هایی که کد آنها بعد از 1711 (حرف "گ") قرار داره و همینطور حروفی که قبل از 1570 (حرف "آ") قرار دارند اکثرا توسط sql server قابل شناسایی نیستند مثل حرف "ی فارسی" که 1740 است و یا حرف " ۞" که 1758 است و علامت شروع حذب هستش.
دقیقا نمیدونم ایراد از چیه اما حس میکنم sql server تو تنظیمات collationهاش یه موردی داره. گرچه انواع و اقسام collationها رو ست کرده و باز هم نشد ، هم collationهای عربی هم فارسی.
بعد اومدم یک برنامه ساده نوشتم شامل یک dbgrid و یک edit جهت جستجو. 2 تا table یکسان هم درست کرد یکی تو sql server و دیگری توی access. برنامم با sql server مشکلاتی رو که گفتم داره اما با access هیچ ایرادی نداره- کلیه حروف با هر کدی که باشند راحت سرچ میشن.
یک ایراد هم تو جدول یونیکد دیدم اونم اینکه کد حرف "ه" قبل از حرف "واو" قرار داره یعنی وقتی که database رو سورت میکنم این شکلی سورت میشه: ..... ل م ن ه و ی که غلطه و در اصل باید اینجوری باشه ..... ل م ن و ه ی.
گیج شدم حسابی. دوستان کسی میدونه اشکال از کجاست؟

homayoon_fara
دوشنبه 30 شهریور 1388, 11:04 صبح
چه جالب هیچ کس به این مشکل بر نخورده؟

اصلا بزارین یه جور دیگه بگم:
من از توی برنامم هر کرکتری رو که در دیتابیس insert می کنم بدون هیچ مشکلی ذخیره میشه ، اما همه کرکترهایی که وارد کردم توسط اس کیو ال search نمیشه مثل اونایی که در پست قبلی گفتم.
یعنی اگر اونهارو search کنم هیچی بر نمیگرده
(محیط برنامه نویسی: دلفی 2009 - دیتابیس: SQL Server 2008)

heivin
سه شنبه 31 شهریور 1388, 01:05 صبح
چه جالب هیچ کس به این مشکل بر نخورده؟

(محیط برنامه نویسی: دلفی 2009 - دیتابیس: SQL Server 2008)

سلام
منم این مشکلو داشتمو دار اما تو sql2005 کار میکنم همه کولیژن های عربی رو امتحان کردم.
مشکلم با حرف 'ی' و 'ک' حل شد اما در حروف 'و' و 'ه' حل نشده (برعکس مرتب میشه)
اینم تاپیکش
http://barnamenevis.org/forum/showthread.php?p=801928#post801928

homayoon_fara
سه شنبه 31 شهریور 1388, 11:16 صبح
سلام دوست عزیز
دیروز یک پرینت سورت شده رو تو جلسه هیات مدیره تحویل دادم - که یک گزارش بود از وضعیت عملکرد شرکت- یکی از آقایون تا دید گفت: مهندس یک دوره برو دبستان الفبا یاد بگیر , شما که همه سیستم ها رو داری طراحی میکنی زشت که الفبای فارسی رو بلد نیستی. گفتم حاج آقا چطور مگه؟
اشاره کرد به همین جابجا بودن حرف واو و ی . با لحن تند بهش گفتم این نشونه بیسوادی من نیست ، نشونه بیچارگی ما ملت که اینقدر تو دنیا برامون ارزش قائل نیستند که فارسی رو به رسمیت بشناسن. خلاصه کلی جرو بحث شد که اینجا نمی شه مطرحش کرد.
حالا جالبه تو sql 2008 هم که مثلا فارسی رو پشتیبانی کرده هر پی که collation فارسی رو انتخاب می کنم sql server ارور میده و قبولش نمی کنه.
خلاصه کلی نشستم برنامه نوشتم تا دستی این ضعف رو جبران کنم.

heivin
سه شنبه 31 شهریور 1388, 19:39 عصر
:افسرده::افسرده:
لطفا اگه زحمتی نیست روشی رو که استفاده کردید برای حل این مشکل، بفرمایید اگه با نمونه کد باشه ممنون میشم

homayoon_fara
چهارشنبه 01 مهر 1388, 12:50 عصر
اول اومدم دیتا هارو تو sql سورت کردم. اتفاقی که میافته اینه که همه درست سورت میشن الا کلماتی با واو با ه شروع شدن. بعد اومدم اطلاعات درست رو ریختم تو یک TStringGrid مجازی که در RunTime ایجادش کردم و البته از دید کاربر هم مخفیه. بعد برگشتم به دوران آغازین اختراع کامپیوتر -یعنی همون وقتی که کاربران با دست stringهاشون رو سورت می کردن- و چنتا for تو در تو نوشتم که میومد حرف به حرف کلمات رو مقایسه می کرد اگه واو بود میاورد بالا اکه ه بود می برد پایین لیست (این یکی از روشهای سورت هست که در درس طراحی الگوریتم داشتیم). خلاصه وقتی تموم می شد اینها رو هم می ریختم ته همون TStringGrid مجازی و بعد دونه دونه به FastReport میفرستادم برای چاپ.

vb_nima
چهارشنبه 01 مهر 1388, 16:33 عصر
یک ایراد هم تو جدول یونیکد دیدم اونم اینکه کد حرف "ه" قبل از حرف "واو" قرار داره یعنی وقتی که database رو سورت میکنم این شکلی سورت میشه: ..... ل م ن ه و ی که غلطه و در اصل باید اینجوری باشه ..... ل م ن و ه ی.
گیج شدم حسابی. دوستان کسی میدونه اشکال از کجاست؟


سلام دوست عزیز
دیروز یک پرینت سورت شده رو تو جلسه هیات مدیره تحویل دادم - که یک گزارش بود از وضعیت عملکرد شرکت- یکی از آقایون تا دید گفت: مهندس یک دوره برو دبستان الفبا یاد بگیر , شما که همه سیستم ها رو داری طراحی میکنی زشت که الفبای فارسی رو بلد نیستی. گفتم حاج آقا چطور مگه؟
اشاره کرد به همین جابجا بودن حرف واو و ی . با لحن تند بهش گفتم این نشونه بیسوادی من نیست ، نشونه بیچارگی ما ملت که اینقدر تو دنیا برامون ارزش قائل نیستند که فارسی رو به رسمیت بشناسن. خلاصه کلی جرو بحث شد که اینجا نمی شه مطرحش کرد.
حالا جالبه تو sql 2008 هم که مثلا فارسی رو پشتیبانی کرده هر پی که collation فارسی رو انتخاب می کنم sql server ارور میده و قبولش نمی کنه.
خلاصه کلی نشستم برنامه نوشتم تا دستی این ضعف رو جبران کنم.

دوستان با خوندن مطالب يه چيزي برام آشنا اومد و اونم اينه كه :
من قبلا كه مي خواستم تو موبايلم فارشي بنويسم زبان نوشتاري را بر روي "عربي" تنظيم ميكردم و مي نوشتم و ميديدم "ه" قبل از "و ". باخودم ميگفتم سازندگان اشتباه كردن. الان كه اين مطالب را ديدم دوباره رفتم تو گوشيم نگاه كردم ديدم آره "ه" قبل از "و". چيزي كه به ذهنم رسيد اينه كه حدس ميزنم اينا اشتباه نكردن بلكه در الفباي عربي "ه" قبل از "و" و تو همون sql server هم براي فارشي از همين الفبا استفاده كردن. البته اين حدسي بود كه من زدم و فكر كنم درست باشه.
من فكر مي كنم درست كردنش احتياج به سورت كردن نداره چون sql server خودش سورت كرده باي فقط اولين ركورد با حرف ابتدايي "ه" و اولين ركورد با حرف ابتدايي "و" را پيدا كرد. بعد ركورداهايي كه در اين بازه(اولين ركورد با حرف ه تا اولين ركورد با حرف و) قرار دارند را يكجا برداشت و به بعد از ركوردهاي "و" منتقل كرد.
البته اين راهي كه من گفتم در حالت تئوري خيلي راحت بود. اگر كاملا عملي نبود شرمندم. فقط راهي كه به ذهنم اومد را گفتم.

vb_nima
چهارشنبه 01 مهر 1388, 18:22 عصر
از دوستان عذرخواهي ميكنم .چون اين روشي كه من در پست قبل گفتم، فكر كنم يه جورايي ناقص.
فقط برا سورتهايي خوبه كه فقط بخواهيم براساس حرف اول كلمه سورت كنيم و بقيه حروف مد نظرمون نباشه. چون بازم در سورتي كه sql server به ما ميده جاهايي كه حرف اولشون يكيه و بر اساس حرف دوم سورت ميشن بازم كلمات با حرف دوم "ه" زودتر از "و" در سورت قرار ميگرند. مثلا فاميل "تهراني" زودتر از فاميل "توانا" در سورت مياد. و بازم سورت يه جورايي ناقص.
اميدوارم راه حل خوبي براي اين مشكل پيدا بشه.