PDA

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



neda_91
دوشنبه 11 آذر 1392, 21:33 عصر
با سلام خدمت دوستان
من می خواستم که ستون ها ی جدولم در دیتا بیس را براساس حروف الفبا در صفحه وب سایتم نمایش بده از دستور orderby استفاده کردم اما بعضی حروف را ترتیبش را درست نشون نمیده تو گوگل سرچ کردم متوجه شدم مشکل الفبای فارسی تو sql است که اینطور نمایش میده
برای این مشکل راه حلی است؟
ممنون میشم راهنماییم کنید

با سپاس

محمد سلیم آبادی
دوشنبه 11 آذر 1392, 22:44 عصر
Collation را به Persian تغییر دهید.
در ادامه یک مثال جامع آوردم که طریقه تغییر Collation ستون مورد نظر به Persian را توضیح داده... .

به لیست سوالات FAQ اضافه شد.


--ایجاد یک جدول آزمایشی با یک ستون رشته ای
CREATE TABLE SampleTable
(
Name VARCHAR(50)
)


--بدست آوردن نام کالیشن ستون مورد نظر
SELECT COLUMN_NAME, COLLATION_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'SampleTable'
AND COLUMN_NAME = 'Name';


--درج دو مقدار ک و گ
INSERT INTO SampleTable
VALUES (N'ک'),
('گ');


SELECT * FROM SampleTable
ORDER BY Name COLLATE Arabic_CI_AI

--خروجی کوئری فوق
/*
name
------
گ
ک
*/


SELECT * FROM SampleTable
ORDER BY Name COLLATE Persian_100_CI_AI

--خروجی کوئری فوق
/*
name
---------
ک
گ
*/

--تغییر کالیشن به پرشین و رفع مشکل مرت سازی مطابق با الفبای فارسی
ALTER TABLE SampleTable
ALTER COLUMN Name NVARCHAR(50) COLLATE Persian_100_CI_AI


--مشاهده تمام کالیشن های مربوط به زبان فارسی
SELECT * FROM sys.fn_helpcollations()
WHERE NAME LIKE 'per%'

in_chand_nafar
دوشنبه 11 آذر 1392, 22:48 عصر
برای کسب اطلاعات بیشتر و... می توانید به این پادکست صوتی (http://www.nikamooz.com/%D8%A7%D9%85%DA%A9%D8%A7%D9%86%D8%A7%D8%AA/radionikamooz/98-collation-%D9%88-%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C-%DA%86%D8%A7%D9%84%D8%B4%E2%80%8C%D9%87%D8%A7%DB%8 C-%D9%85%D8%B1%D8%A8%D9%88%D8%B7-%D8%A8%D9%87-%D8%A2%D9%86-%D8%AF%D8%B1-%D8%B2%D8%A8%D8%A7%D9%86-%D9%81%D8%A7%D8%B1%D8%B3%DB%8C.html) (فارسی) گوش دهید

neda_91
سه شنبه 12 آذر 1392, 18:50 عصر
Collation را به Persian تغییر دهید.
در ادامه یک مثال جامع آوردم که طریقه تغییر Collation ستون مورد نظر به Persian را توضیح داده... .

به لیست سوالات FAQ اضافه شد.


--ایجاد یک جدول آزمایشی با یک ستون رشته ای
CREATE TABLE SampleTable
(
Name VARCHAR(50)
)


--بدست آوردن نام کالیشن ستون مورد نظر
SELECT COLUMN_NAME, COLLATION_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'SampleTable'
AND COLUMN_NAME = 'Name';


--درج دو مقدار ک و گ
INSERT INTO SampleTable
VALUES (N'ک'),
('گ');


SELECT * FROM SampleTable
ORDER BY Name COLLATE Arabic_CI_AI

--خروجی کوئری فوق
/*
name
------
گ
ک
*/


SELECT * FROM SampleTable
ORDER BY Name COLLATE Persian_100_CI_AI

--خروجی کوئری فوق
/*
name
---------
ک
گ
*/

--تغییر کالیشن به پرشین و رفع مشکل مرت سازی مطابق با الفبای فارسی
ALTER TABLE SampleTable
ALTER COLUMN Name NVARCHAR(50) COLLATE Persian_100_CI_AI


--مشاهده تمام کالیشن های مربوط به زبان فارسی
SELECT * FROM sys.fn_helpcollations()
WHERE NAME LIKE 'per%'


سلام
خیلی ممنون از پاسختون من این کارهایی که گفتید انجام دادم اول همه داده ها را درست نشان میداد اما وقتی دیتا جدید به جدولم اضافه میکنم و دوباره صفحه سایتم را رفرش می کنم داده ها را جا بجا نشان میدهد مثلا"
قبل از اضافه کردن دیتای جدید:
-ارتباطات
-تصویر
-لپ تاپ
-نرم افزار

بعد از اضافه کردن دیتا با عنوان سخت افزار به صورت زیر نمایش داده می شود

-ارتباطات
-سخت افزار
-تصویر
-لپ تاپ
-نرم افزار
در صورتیکه سخت افزار باید بعد از کلمه تصویر اضافه شود چند تا کلمه دیگه هم امتحان کردم اما همینطور قاطی نشان میداد مثلا اگر کلمه امنیت را اضافه کنم در جای درست خود نشان میدهد...

ممنون میشم راهنماییم کنید...
با سپاس

محمد سلیم آبادی
چهارشنبه 13 آذر 1392, 03:09 صبح
Query اتان را در DBMS بررسی کنید. در ضمن این ناهنجاری در مرتب سازی هیچ گونه ارتباطی با Collation ندارد، حداقل در ظاهر.
اگر کوئری در خود DBMS هم همین رفتار را نشان داد، در صورت تمایل میتونید کوئری را در اینجا قرار دهید تا بررسی شود.

neda_91
پنج شنبه 14 آذر 1392, 12:10 عصر
Query اتان را در DBMS بررسی کنید. در ضمن این ناهنجاری در مرتب سازی هیچ گونه ارتباطی با Collation ندارد، حداقل در ظاهر.
اگر کوئری در خود DBMS هم همین رفتار را نشان داد، در صورت تمایل میتونید کوئری را در اینجا قرار دهید تا بررسی شود.

با سلام مجدد
کوئری که استفاده کردم به صورت زیر است


ALTER PROCEDURE [dbo].[GetCustomersPageWise3]
@PageIndex INT = 1
,@PageSize INT = 5
,@RecordCount INT OUTPUT
,@Region nvarchar(10)
,@district nvarchar(20)
,@shoppingcenter nvarchar(30)
AS
BEGIN



select distinct House_Info.Image_Behcode,House_Info.Image_Header,H ouse_Info.Name,substring (isnull(House_Info.[Service1]+',','')+isnull(House_Info.[Service2]+',','')+isnull(House_Info.[Service3]+',','')+isnull(House_Info.[Service4]+',','')+isnull(House_Info.[Service5]+',','')+isnull(House_Info.[Service6]+',','')+isnull(House_Info.[Service7]+',','')+isnull('',''),0,50)+'...' as Description,substring(House_Info.[Description],0,45)+'...' As Description2 ,SUBSTRING(House_Info.[District]+'-'+ House_Info.[Address],0,58)+'...' as Address,House_Info.BehCode,House_Info.img_store
into #Temp
from House_Info

WHERE ([HOuse_info].Region = @Region or @Region='همه') and ([House_Info].District=@District or @District='همه') and ([House_Info].ShoppingCenter=@shoppingcenter or @shoppingcenter=N'کلیه اصناف در سطح شهرها') and (House_Info.H_name2='House')
group by House_Info.address, House_Info.District,House_Info.Name,House_Info.Ima ge_Behcode,House_Info.Image_Header,House_Info.Serv ice1,House_Info.Service2,House_Info.Service3,House _Info.Service4,House_Info.Service5,House_Info.Serv ice6,House_Info.Service7,House_Info.Description,Ho use_Info.BehCode,House_Info.img_store



SELECT ROW_NUMBER() OVER
(
order by Name COLLATE Persian_100_CI_AI asc

)AS RowNumber, *
INTO #Results
FROM #Temp

SELECT @RecordCount = COUNT(*)
FROM #Results

SELECT * FROM #Results
WHERE (RowNumber BETWEEN(@PageIndex -1) * @PageSize + 1 AND(((@PageIndex -1) * @PageSize + 1) + @PageSize) - 1)


DROP TABLE #Results
DROP TABLE #Temp

END




و به صورت زیر اجرا کردم

'همه','همه','همه',exec GetCustomersPageWise3 1,5,10,

اما چیزی نشون نمیده

یک سوالی که داشتم اینه که من فیلد مربوط به name جدول را که select بر اساس آن است Collation آن را به persian تغییر دادم اما رفتم دیدم که گزینه accent sensitive آن تیک خرده امکان داره که مشکل از آن باشه؟
در اینصورت آن را چطور میتونم تغییر بدم؟

ممنون از راهنماییتون

neda_91
پنج شنبه 14 آذر 1392, 12:10 عصر
Query اتان را در DBMS بررسی کنید. در ضمن این ناهنجاری در مرتب سازی هیچ گونه ارتباطی با Collation ندارد، حداقل در ظاهر.
اگر کوئری در خود DBMS هم همین رفتار را نشان داد، در صورت تمایل میتونید کوئری را در اینجا قرار دهید تا بررسی شود.

با سلام مجدد
کوئری که استفاده کردم به صورت زیر است


ALTER PROCEDURE [dbo].[GetCustomersPageWise3]
@PageIndex INT = 1
,@PageSize INT = 5
,@RecordCount INT OUTPUT
,@Region nvarchar(10)
,@district nvarchar(20)
,@shoppingcenter nvarchar(30)
AS
BEGIN



select distinct House_Info.Image_Behcode,House_Info.Image_Header,H ouse_Info.Name,substring (isnull(House_Info.[Service1]+',','')+isnull(House_Info.[Service2]+',','')+isnull(House_Info.[Service3]+',','')+isnull(House_Info.[Service4]+',','')+isnull(House_Info.[Service5]+',','')+isnull(House_Info.[Service6]+',','')+isnull(House_Info.[Service7]+',','')+isnull('',''),0,50)+'...' as Description,substring(House_Info.[Description],0,45)+'...' As Description2 ,SUBSTRING(House_Info.[District]+'-'+ House_Info.[Address],0,58)+'...' as Address,House_Info.BehCode,House_Info.img_store
into #Temp
from House_Info

WHERE ([HOuse_info].Region = @Region or @Region='همه') and ([House_Info].District=@District or @District='همه') and ([House_Info].ShoppingCenter=@shoppingcenter or @shoppingcenter=N'کلیه اصناف در سطح شهرها') and (House_Info.H_name2='House')
group by House_Info.address, House_Info.District,House_Info.Name,House_Info.Ima ge_Behcode,House_Info.Image_Header,House_Info.Serv ice1,House_Info.Service2,House_Info.Service3,House _Info.Service4,House_Info.Service5,House_Info.Serv ice6,House_Info.Service7,House_Info.Description,Ho use_Info.BehCode,House_Info.img_store



SELECT ROW_NUMBER() OVER
(
order by Name COLLATE Persian_100_CI_AI asc

)AS RowNumber, *
INTO #Results
FROM #Temp

SELECT @RecordCount = COUNT(*)
FROM #Results

SELECT * FROM #Results
WHERE (RowNumber BETWEEN(@PageIndex -1) * @PageSize + 1 AND(((@PageIndex -1) * @PageSize + 1) + @PageSize) - 1)


DROP TABLE #Results
DROP TABLE #Temp

END




و به صورت زیر اجرا کردم

'همه','همه','همه',exec GetCustomersPageWise3 1,5,10,

اما چیزی نشون نمیده

یک سوالی که داشتم اینه که من فیلد مربوط به name جدول را که select بر اساس آن است Collation آن را به persian تغییر دادم اما رفتم دیدم که گزینه accent sensitive آن تیک خرده امکان داره که مشکل از آن باشه؟
در اینصورت آن را چطور میتونم تغییر بدم؟

ممنون از راهنماییتون

محمد سلیم آبادی
شنبه 16 آذر 1392, 12:31 عصر
اگر شما Collation فیلد (ستون/Column) مورد نظر را به Persian تغییر دادی که خب دیگه لازم نیست در زمان Sort کردن از COLLATE استفاده کنید (کاری که شما انجام دادین).
اگر شما Collation فیلد مورد نظر را به Persian_100_CI_AI تغییر دادین این غیر ممکنه که تیک Accent Sensitive خورده باشد (ضمن اینکه زبان فارسی نه بحث لهجه و نه بحث بزرگ و کوچیک بودن حروف در آن مطرح نیست پس قاعدتا نباید هم تاثیری در Sort و مرتب سازی داشته باشد)

neda_91
یک شنبه 17 آذر 1392, 14:14 عصر
با سلام
خوب من تو sort اون قسمت را حذف کردم و به صورت Order by name asc نوشتم اما باز هم مشکلم حل نشد وقتی آیتم جدید اضافه می کنم به ترتیب نشون نمیده....
چکار کنم؟من از دیتالیست برای نمایش داده ها استفاده کردم...

نمیدونم چکار کنم حتما باید بر اساس حروف الفبا باشه...
ممنون میشم کمکم کنید

با سپاس

dublsigma
دوشنبه 18 آذر 1392, 10:27 صبح
احتمالا مشکل به کنترل دیتالیست برمیگرده. بررسی کنید ببینید این کنترل بر چه اساسی مرتب میشن داده در اون.

neda_91
دوشنبه 18 آذر 1392, 21:05 عصر
احتمالا مشکل به کنترل دیتالیست برمیگرده. بررسی کنید ببینید این کنترل بر چه اساسی مرتب میشن داده در اون.

خوب تو کنترل دیتالیست بر اساس همان چیزی که من در storeprocedure تعریف کردم مرتب میشه که اینجا بر اساس order by Name asc می باشد.

حمیدرضاصادقیان
جمعه 29 آذر 1392, 13:28 عصر
سلام.
به جز موارد مطرح شده یک امکانی هست که شما به صورت Binary داده هاتون رو مرتب کنید.
اینجوری داده ها کاملا درست مرتب خواهند شد.
پیشنهاد میکنم اینجا (http://msdn.microsoft.com/en-us/library/ms143350(v=sql.105).aspx) رو ببینید.