sql >> データベース >  >> RDS >> Sqlserver

nvarchar(Unicode)列のCOLLATIONSのポイントは何ですか?

    文字の保存と表現は1つのことであり、文字の並べ替えと比較の方法を知ることは別のことです。

    XMLに保存されているUnicodeデータ およびN -SQL Serverのプレフィックス付きの型は、単一の文字セットですべての言語のすべての文字を表すことができます(ほとんどの場合、それが目標です)。したがって、NCHARの場合 / NVARCHAR データ(NTEXTは省略しています もう使用しないでください。XML 照合の影響を受けないため、照合によって保存できる文字が変更されることはありません。 CHARの場合 およびVARCHAR データ、照合は 各照合が特定のコードページを指すときに保存できるものに影響します。これにより、値128〜255に保存できるものが決まります。

    現在、すべての文字にデフォルトの並べ替え順序がありますが、すべての言語と文化で機能するわけではありません。一部/多数/すべての文字を共有する言語はたくさんありますが、それらの並べ替え方法にはさまざまなルールがあります。たとえば、これらの文字を使用するほとんどのアルファベットでは、文字「C」が文字「D」の前にあります。アメリカ英語では、「C」と「H」の組み合わせ(つまり、2つの別々の文字としての「CH」)は、「D」で始まる文字列の前に自然に来ます。ただし、一部の言語では、「CH」の2文字の組み合わせは特別であり、に並べ替えられます。 「D」:

    IF (   N'CH' COLLATE Czech_CI_AI > N'D' COLLATE Czech_CI_AI
       AND N'C'  COLLATE Czech_CI_AI < N'D' COLLATE Czech_CI_AI
       AND N'CI' COLLATE Czech_CI_AI < N'D' COLLATE Czech_CI_AI
       ) PRINT 'Czech_CI_AI';
    
    IF (   N'CH' COLLATE Czech_100_CI_AI > N'D' COLLATE Czech_100_CI_AI
       AND N'C'  COLLATE Czech_100_CI_AI < N'D' COLLATE Czech_100_CI_AI
       AND N'CI' COLLATE Czech_100_CI_AI < N'D' COLLATE Czech_100_CI_AI
       ) PRINT 'Czech_100_CI_AI';
    
    IF (   N'CH' COLLATE Slovak_CI_AI > N'D' COLLATE Slovak_CI_AI
       AND N'C'  COLLATE Slovak_CI_AI < N'D' COLLATE Slovak_CI_AI
       AND N'CI' COLLATE Slovak_CI_AI < N'D' COLLATE Slovak_CI_AI
       ) PRINT 'Slovak_CI_AI';
    
    IF (   N'CH' COLLATE Slovak_CS_AS > N'D' COLLATE Slovak_CS_AS
       AND N'C'  COLLATE Slovak_CS_AS < N'D' COLLATE Slovak_CS_AS
       AND N'CI' COLLATE Slovak_CS_AS < N'D' COLLATE Slovak_CS_AS
       ) PRINT 'Slovak_CS_AS';
    
    IF (   N'CH' COLLATE Latin1_General_100_CI_AS > N'D' COLLATE Latin1_General_100_CI_AS
       AND N'C'  COLLATE Latin1_General_100_CI_AS < N'D' COLLATE Latin1_General_100_CI_AS
       AND N'CI' COLLATE Latin1_General_100_CI_AS < N'D' COLLATE Latin1_General_100_CI_AS
       ) PRINT 'Latin1_General_100_CI_AS'
    ELSE PRINT 'Nope!';
    

    返品:

    Czech_CI_AI
    Czech_100_CI_AI
    Slovak_CI_AI
    Slovak_CS_AS
    Nope!
    

    さまざまなカルチャにわたる並べ替えルールの例については、照合チャート を参照してください。 。

    また、一部の言語では、特定の文字または文字の組み合わせが、他のほとんどの言語とは異なる方法で他の文字と同等になります。たとえば、デンマーク語でのみ「å」は「aa」に相当します。ただし、「å」は単一の「a」と同じではありません:

    IF (N'aa' COLLATE Danish_Greenlandic_100_CI_AI =  N'å' COLLATE Danish_Greenlandic_100_CI_AI
    AND N'a'  COLLATE Danish_Greenlandic_100_CI_AI <> N'å' COLLATE Danish_Greenlandic_100_CI_AI
       ) PRINT 'Danish_Greenlandic_100_CI_AI';
    
    IF (   N'aa' COLLATE Danish_Norwegian_CI_AI =  N'å' COLLATE Danish_Norwegian_CI_AI
       AND N'a'  COLLATE Danish_Norwegian_CI_AI <> N'å' COLLATE Danish_Norwegian_CI_AI
       ) PRINT 'Danish_Norwegian_CI_AI';
    
    IF (   N'aa' COLLATE Latin1_General_100_CI_AI =  N'å' COLLATE Latin1_General_100_CI_AI
       AND N'a'  COLLATE Latin1_General_100_CI_AI <> N'å' COLLATE Latin1_General_100_CI_AI
       ) PRINT 'Latin1_General_100_CI_AI'
    ELSE PRINT 'Nope!';
    

    返品:

    Danish_Greenlandic_100_CI_AI
    Danish_Norwegian_CI_AI
    Nope!
    

    これはすべて非常に複雑であり、右から左への言語(ヘブライ語とアラビア語)、中国語、日本語、結合文字などの処理についても言及していません。

    ルールについての深い洞察が必要な場合は、 Unicode Collat​​ion Algorithm(UCA)> 。上記の例は、そのドキュメントの例に基づいていますが、特にWindowsの照合(照合ではない)以降、UCAのすべてのルールが実装されているとは思いません。 SQL_で始まる )は、使用しているOSとインストールされている.NET Frameworkのバージョンに応じて、Unicode 5.0または6.0に基づいています( SortVersion 詳細については)

    これが照合の機能です。使用可能なすべての照合を表示する場合は、次を実行するだけです。

    SELECT [name] FROM sys.fn_helpcollations() ORDER BY [name];
    


    1. タイムスタンプの月の部分でグループ化するSQLクエリ

    2. pgAdminエラー-リレーション[関数/ビュー/トリガー関数の名前]が存在しません

    3. postgresの日付表現をISO8601文字列に変換します

    4. opencart-テンプレートファイル内にモジュールを手動で表示する方法は?