3

質問はアルメニア人についてです。SQL Server 2005、照合SQL_Latin1_General_CP1_CI_ASを使用しています。データはほとんどアルメニア語であり、Unicodeを使用できません。

アルメニア語(Cyrillic_General_100_)のWindows照合を使用してms sql 2008でテストしましたが、ここ(http://msdn.microsoft.com/en-us/library/ms188046.aspx)で見つかりましたが、役に立ちませんでした。

16進値を順序付ける関数と、各文字列の各文字を取得して下位形式に変換する下位関数がありますが、これは受け入れられない解決策です。動作が非常に遅く、巨大なテーブルのすべての列でその関数を呼び出します。 。

Unicodeを使用せず、16進値を手動で操作しないこの問題の解決策はありますか?

アップデート:

左側には大文字と小文字が混在する単語があり、右側に小文字で表示され、正しい順序で並べ替えられています。これがお役に立てば幸いです。ありがとうございました。単語はUnicodeで書かれています。

  1. Ʊբdzդǵզ->աբգդեզ

  2. ƱգdzսǴǼ->ագգսդլ

  3. DzաǴֆդǴ->բադֆդդ

  4. dzdzǼասա->գգլասա

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

  6. յլDzնՆն->ելբննն

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

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

  9. ոխǾդսՂ->ըխծդսղ

  10. ƹǶէըǿր->թզէըկր

4

2 に答える 2

3

1 つの解決策は、値をアルメニア語の照合順序に変換し、次のように小文字に設定する各テキスト列の計算列を作成することです。

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 を使用してエンコードされ、アルメニア語が UTF-8 に適合するためです。第二に、これはあなたが達成しようとしていること、つまりSQL ServerにUTF-8を格納することを示唆しています。残念ながら、SQL Server 2008 (またはそれ以前のバージョン) は UTF-8 をネイティブにサポートしていません。データを UTF-8 で保存するには、いくつかの選択肢があります。

  1. バイナリで保存し、クライアントで UTF-8 に変換します (これにより、サーバーで行われた並べ替えがほとんどなくなります)。
  2. Unicode で保存し、クライアントで UTF-8 に変換します。SQL Server ドライバーは既にほとんどの文字列を Unicode に変換しており、例は Unicode で正常に動作することに注意してください。明らかな欠点は、2 倍のスペースを占有することです。
  3. SQL Server で CLR ユーザー定義型を作成して、UTF-8 値を格納します。Microsoft は、これを行うために SQL Server に付属するサンプルを提供しています。ここから CodePlexのサンプルをダウンロードできます。サンプルの詳細については、 Books Onlineのこの記事を参照してください。欠点は、SQL Server で CLR を有効にする必要があり、それがどれほどうまく機能するかわかりません。

そうは言っても、SQL Server で Unicode を使用してサンプルを問題なく動作させることができました。

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)

これら 3 つのクエリはすべて同じ結果を返します。

于 2010-03-30T05:58:39.437 に答える
0

このようなエラーが発生しましたか?

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

試す:

ORDER BY Name COLLATE Cyrillic_General_100_CI_AS

または、次のリストからお好みの 1 つを選択してください。

select * from fn_helpcollations()
where name like 'Cyrillic_General_100_%'
于 2010-03-30T06:14:22.813 に答える