برگزیده های پرشین تولز

مشکل مرتب سازی رکوردهای فارسی

m.parvazi

Registered User
تاریخ عضویت
10 می 2006
نوشته‌ها
1,016
لایک‌ها
86
سن
40
سلام

همینطور که میدونید حروف "گ ژ پ چ" آخرین حروفی بودند که به فونت ها اضافه شدند تا به اصطلاح امکان تایپ فارسی فراهم بشه. به همین خاطر Unicode اونا از بقیه بزرگتره (حروف فارسی مرتب نیستند!)

برای مرتب سازی یه ستون که به صورت فارسیه مشکل از این جا پیش میاد که چون DBMS ها بر اساس Unicode مرتب می کنند این حروف اول میاند و بعد حروف دیگه (db دانشگاه ما تا همین یکی دو سال پیش این مشکل رو داشت و من - پروازی - همیشه نفر اول لیست اساتید بودم، متاسفانه!)

تویه Access این مشکل حل شده وشنیدم که dbase هم اجازه میده برای هر ستون یه فونت جداگانه تعریف کنید و با یه فونت مخصوص فارسی این مشکل حل میشه

اما برای MySQL چه روشی رو پیشنهاد میکنید؟
 

amirsung

کاربر تازه وارد
تاریخ عضویت
28 نوامبر 2003
نوشته‌ها
210
لایک‌ها
0
محل سکونت
Madrid, Spain
به نقل از m.parvazi :
سلام

همینطور که میدونید حروف "گ ژ پ چ" آخرین حروفی بودند که به فونت ها اضافه شدند تا به اصطلاح امکان تایپ فارسی فراهم بشه. به همین خاطر Unicode اونا از بقیه بزرگتره (حروف فارسی مرتب نیستند!)

برای مرتب سازی یه ستون که به صورت فارسیه مشکل از این جا پیش میاد که چون DBMS ها بر اساس Unicode مرتب می کنند این حروف اول میاند و بعد حروف دیگه (db دانشگاه ما تا همین یکی دو سال پیش این مشکل رو داشت و من - پروازی - همیشه نفر اول لیست اساتید بودم، متاسفانه!)

تویه Access این مشکل حل شده وشنیدم که dbase هم اجازه میده برای هر ستون یه فونت جداگانه تعریف کنید و با یه فونت مخصوص فارسی این مشکل حل میشه

اما برای MySQL چه روشی رو پیشنهاد میکنید؟

فکر نمی کنم این حرفت درباره ی آخر اضافه شدن گ چ پ ژ درست باشه درباره یونیکد. پروژه ی یونیکد فارسی کاملا مستقل از یونیکد عربی انجام شده و حروفش هم ترتیب درست داره.
موقع sort کردن به جای اینکه برحسب مثلا last_name مرتب کنی بر اساس
PHP:
hex(last_name)
مرتب کن شاید درست بشه چون من قبلا این مشکلو داشتم و با این کار درست شد.
 

m.parvazi

Registered User
تاریخ عضویت
10 می 2006
نوشته‌ها
1,016
لایک‌ها
86
سن
40
16bbkwh.gif
 

jhoseinii

Registered User
تاریخ عضویت
20 فوریه 2006
نوشته‌ها
154
لایک‌ها
1
محل سکونت
تهران
دوست عزیز اگه راهه سادش رو پیدا کردی که هیچ.
اگر هم بیجواب موندی ، خونه آخرش اینکه با %key% دونه دونه حروف رو خودت sort کنی.
مثلا یه حلقه بزاری از الف تا ی بگردی و همه حروف و اعداد رو با %name بکشی بیرون

نمونش:
select * from table where 1 and id like X%​
این دستور تمام record هایی که با x شروع میشه رو fetch میکنه


البته قطعا راه ساده تری هم هست. اما این به نظرم مطمعنه
یاحــــق:happy:
 

m.parvazi

Registered User
تاریخ عضویت
10 می 2006
نوشته‌ها
1,016
لایک‌ها
86
سن
40
کد:
select * from test1 where name like 'پ%'

جالبه، به نظرم یه کار منطقی!
فقط تعداد for هاش;)
 

jhoseinii

Registered User
تاریخ عضویت
20 فوریه 2006
نوشته‌ها
154
لایک‌ها
1
محل سکونت
تهران
به نقل از m.parvazi :
کد:
select * from test1 where name like 'پ%'

جالبه، به نظرم یه کار منطقی!
فقط تعداد for هاش;)

به اندازه تعداد حروف فارسی + 1

چون موارد غیر حروف فارسی رو به حالت استاندارد fetch میکنی ;)
 

amirsung

کاربر تازه وارد
تاریخ عضویت
28 نوامبر 2003
نوشته‌ها
210
لایک‌ها
0
محل سکونت
Madrid, Spain
به نقل از jhoseinii :
به اندازه تعداد حروف فارسی + 1

چون موارد غیر حروف فارسی رو به حالت استاندارد fetch میکنی ;)

اوه ببخشید. پس من اشتباه کردم. نمیدونستم که یونیکد فارسی فقط این 4 حرفو به عربی اضافه کردن.

یک نکته اینه که با توجه به این مرتب کردن خیلی خیلی سخته چون حتی اگر حروف اول رو مرتب کنیم، برای کلماتی که حروف اول یکسان دارن باید بریم سراغ حرف دوم و به همین ترتیب حرفاای بعدی که کارو خیلی سخت میکنه.

حال اگر بر اساس حرف اول بخوای من یک روش به ذهنم رسید که با یک کوئری همه رو مرتب کنه:

PHP:
SELECT first_name, (
substring( first_name, 1, 2 ) = 'آ'
) AS aa, (
substring( first_name, 1, 2 ) = 'ا'
) AS a, (
substring( first_name, 1, 2 ) = 'ب'
) AS be, (
substring( first_name, 1, 2 ) = 'پ'
) AS pe
FROM userlist
ORDER BY aa DESC , a DESC , be DESC , pe DESC
LIMIT 0 , 30

من اینو تا «پ» رفتم ولی خودت تا آخرش میتونی بگذاری. البته با یک حلقه خیلی راحت میتونی این کوئری رو کامل بسازی.
 

minipars

کاربر تازه وارد
تاریخ عضویت
31 ژانویه 2006
نوشته‌ها
83
لایک‌ها
0
محل سکونت
Germany
میتونی همرو بگیری بعد با PHP
SORT کنی .
این کار رو به خوبی انجام میده .
 

sama_sally

Registered User
تاریخ عضویت
5 آپریل 2005
نوشته‌ها
2,598
لایک‌ها
1
سن
35
محل سکونت
Essen, Deutschland
درسته ! من به دفعات مطالب فارسی رو تو php سورت کردم مشکلی پیش نیومده! فقط با sort()
 

amirsung

کاربر تازه وارد
تاریخ عضویت
28 نوامبر 2003
نوشته‌ها
210
لایک‌ها
0
محل سکونت
Madrid, Spain
به نقل از sama_sally :
درسته ! من به دفعات مطالب فارسی رو تو php سورت کردم مشکلی پیش نیومده! فقط با sort()

آره.. ولی اگر دیتابیس بزرگ باشه اینکه توی یک آرایه ذخیره کنی این حجم زیاد اطلاعات رو زیاد جالب نمیشه.
 

m.parvazi

Registered User
تاریخ عضویت
10 می 2006
نوشته‌ها
1,016
لایک‌ها
86
سن
40
منظورم دیتابیس بانک ها ، سازمان سنجش یا ... که رکوردهای خیلی زیادی دارن و بهتره این وظیفه رو به dbms بسپاریم.

یه راهی به نظرم رسید ولی امتحانش نکردم!

اگه ستون name اسامی اصلی رو داشته باشه یه ستون دیگه مثل name2 که فقط خودمون باهاش کار داریم در نظر بگیرید(hidden). برای تمام حروف فارسی از الف تا ی یه رنج از یونیکد ایجاد کنیم (قراردادی ولی مرتب). وقتی name رو در table قرار میدیم با یه for و switch-case این اسم رو به رنج یونیکد دلخواه خودمون که مرتبه تبدیل کنیم و در name2 قرار بدیم.

ممکنه محتوای name2 چرت و پرت بشه (از لحاظ کاراکتری) ولی از نظر یونیکدی کاملا معنی داره و برای یه dbms مثلا MySQL با معنیه!

query مرتب سازی هم با name2 سر و کار داره.​
 

ahpiri

Registered User
تاریخ عضویت
5 می 2010
نوشته‌ها
217
لایک‌ها
38
محل سکونت
تهران
سلام

همینطور که میدونید حروف "گ ژ پ چ" آخرین حروفی بودند که به فونت ها اضافه شدند تا به اصطلاح امکان تایپ فارسی فراهم بشه. به همین خاطر Unicode اونا از بقیه بزرگتره (حروف فارسی مرتب نیستند!)

برای مرتب سازی یه ستون که به صورت فارسیه مشکل از این جا پیش میاد که چون DBMS ها بر اساس Unicode مرتب می کنند این حروف اول میاند و بعد حروف دیگه (db دانشگاه ما تا همین یکی دو سال پیش این مشکل رو داشت و من - پروازی - همیشه نفر اول لیست اساتید بودم، متاسفانه!)

تویه Access این مشکل حل شده وشنیدم که dbase هم اجازه میده برای هر ستون یه فونت جداگانه تعریف کنید و با یه فونت مخصوص فارسی این مشکل حل میشه

اما برای MySQL چه روشی رو پیشنهاد میکنید؟
من با این query زدم نتیجه رو دست برمیگردونه. حتی در مورد گ چ پ ژ:
“SELECT * FROM node ORDER BY CONVERT(name USING utf8) COLLATE utf8_persian_ci”
 
بالا