文字の保存と表現は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 Collation Algorithm(UCA)> 。上記の例は、そのドキュメントの例に基づいていますが、特にWindowsの照合(照合ではない)以降、UCAのすべてのルールが実装されているとは思いません。 SQL_
で始まる )は、使用しているOSとインストールされている.NET Frameworkのバージョンに応じて、Unicode 5.0または6.0に基づいています( SortVersion
詳細については)
これが照合の機能です。使用可能なすべての照合を表示する場合は、次を実行するだけです。
SELECT [name] FROM sys.fn_helpcollations() ORDER BY [name];