كيفية استخدام الطلب بواسطة ، أقل في SQL Server 2008 مع بيانات غير unicode

StackOverflow https://stackoverflow.com/questions/2543074

  •  23-09-2019
  •  | 
  •  

سؤال

السؤال عن الأرمن. أنا أستخدم SQL Server 2005 ، Collation SQL_LATIN1_GENERAL_CP1_CI_AS ، البيانات في الغالب أرميني ولا يمكننا استخدام Unicode.

لقد اختبرت على MS SQL 2008 مع مجموعة Windows للغة الأرمنية (Cyrillic_general_100_) ، لقد وجدت هنا ، ( http://msdn.microsoft.com/en-us/library/ms188046.aspx ) لكنها لم تساعد.

لديّ وظيفة ، تطلب قيم سداسي عشرية ووظيفة أقل ، والتي تأخذ كل تشار في كل سلسلة وتحولها إلى شكلها الأدنى ، لكنها ليست مقبولة ، فهي تعمل بطيئة للغاية ، واتصل بالوظائف على كل عمود من طاولة ضخمة .

هل هناك أي حل لهذه المشكلة لا تستخدم Unicode ولا يعمل مع قيم Hex يدويًا؟

تحديث:

على الجانب الأيسر توجد كلمات مختلطة ، يتم فرزها بالترتيب الصحيح ومع تمثيل الحالة الأدنى على الجانب الأيمن. أتمنى أن يساعد هذا. شكرا. الكلمات مكتوبة في يونيكود.

  1. ԱբԳդԵզ -> աբգդեզ

  2. ԱգԳսԴԼ -> ագգսդլ

  3. ԲաԴֆդԴ -> բադֆդդ

  4. ԳԳԼասա -> գգլասա

  5. ԴմմլօՏ -> դմմլօտ

  6. ԵլԲնՆն -> ելբննն

  7. ԶՎլուտ -> զվլուտ

  8. էԹփձջՐ -> էթփձջր

  9. ԸխԾդսՂ -> ըխծդսղ

  10. ԹԶէըԿր -> թզէըկր

هل كانت مفيدة؟

المحلول

يتمثل أحد الحلول في إنشاء عمود محسوب لكل عمود نصي يحول القيمة إلى ترتيب أرمني ويضعها على حالة أقل مثل:

Alter Table TableName
    Add TextValueArmenian As ( LOWER(TextColumn COLLATE Latin1_General_CI_AS) ) PERSISTED

بمجرد القيام بذلك ، يمكنك وضع فهارس على هذه الأعمدة والاستعلام عنها.

إذا لم تكن هذه نكهة الشاي ، فإن حلًا آخر سيكون عرضًا مفهرسًا حيث تقوم بإنشاء طريقة عرض SCHEMABINDING هذا يلقي كل من الأعمدة المختلفة إلى الحالة السفلية وإلى الترتيب الأيمن ثم وضع الفهارس على هذا العرض.

تعديل لقد لاحظت في الأمثلة الخاصة بك ، أن تستخدمك غير حساس للحالة ، وحساسة. ربما يكون الحل البسيط لمشكلات الطلب هو استخدام latin1_general_cs_as أو cyrillic_general_100_cs_as إذا كان ذلك متاحًا.

تعديل

يا للعجب. بعد قدر كبير من البحث ، أعتقد أن لدي إجابة قد لا تريدها للأسف. أولاً ، نعم ، يمكنني نسخ النص الذي قدمته في رمز أو شيء مثل Notepad ++ لأن StackOverflow يتم ترميزه باستخدام UTF-8 و Armenian سوف يتناسب مع UTF-8. ثانياً ، هذا يشير إلى ما تحاول تحقيقه: تخزين UTF-8 في SQL Server. لسوء الحظ ، لا يدعم SQL Server 2008 (أو أي إصدار مسبق) أصلاً UTF-8. من أجل تخزين البيانات في UTF-8 ، لديك عدد قليل من الخيارات:

  1. قم بتخزينه في ثنائي وقم بتحويله إلى UTF-8 على العميل (والذي يلغي إلى حد كبير أي فرز يتم على الخادم)
  2. قم بتخزينه في Unicode وقم بتحويله إلى UTF-8 على العميل. تجدر الإشارة إلى أن برنامج تشغيل SQL Server سيقوم بالفعل بتحويل معظم الأوتار إلى Unicode وأن مثالك يعمل بشكل جيد في Unicode. الجانب السلبي الواضح هو أنه يأكل مرتين المساحة.
  3. قم بإنشاء نوع محدد مستخدم CLR في SQL Server لتخزين قيم UTF-8. توفر Microsoft عينة تأتي مع SQL Server للقيام بذلك فقط. يمكنك تنزيل العينات من codeplex من هنا. يمكنك أيضًا العثور على مزيد من المعلومات حول العينة في هذه المقالة في الكتب على الانترنت. الجانب السلبي هو أنه يتعين عليك تمكين CLR في SQL Server ولست متأكدًا من مدى جودة أدائه.

الآن ، ومع ذلك ، تمكنت من الحصول على عينة من العمل دون أي مشكلة في استخدام Unicode في SQL Server.

If object_id('tempdb..#Test') Is Not Null
    Drop Table #Test
GO
Create Table #Test
(
    EntrySort int identity(1,1) not null
    , ProperSort int 
    , MixedCase nvarchar(50)
    , Lowercase nvarchar(50)
)
GO
Insert #Test(ProperSort, MixedCase, Lowercase)
Select 1, N'ԱբԳդԵզ',N'աբգդեզ'
Union All Select 6, N'ԵլԲնՆն',N'ելբննն'
Union All Select 2, N'ԱգԳսԴԼ',N'ագգսդլ'
Union All Select 3, N'ԲաԴֆդԴ',N'բադֆդդ'
Union All Select 4, N'ԳԳԼասա',N'գգլասա'
Union All Select 5, N'ԴմմլօՏ',N'դմմլօտ'
Union All Select 9, N'ԸխԾդսՂ',N'ըխծդսղ'
Union All Select 7, N'ԶՎլուտ',N'զվլուտ'
Union All Select 10, N'ԹԶէըԿր',N'թզէըկր'
Union All Select 8,N'էԹփձջՐ',N'էթփձջր'

Select * From #Test Order by ProperSort
Select * From #Test Order by Lowercase
Select * From #Test Order by Lower(MixedCase)

جميع هذه الاستعلامات الثلاثة تعود نفس النتيجة.

نصائح أخرى

هل حصلت على خطأ مثل هذا؟

Msg 448, Level 16, State 1, Line 1
Invalid collation 'Cyrillic_General_100_'.

محاولة:

ORDER BY Name COLLATE Cyrillic_General_100_CI_AS

أو اختر واحدة تفضلها من هذه القائمة:

select * from fn_helpcollations()
where name like 'Cyrillic_General_100_%'
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top