17

私はこれについてたくさん読んだ。

まだいくつかの質問:

ここでは大文字と小文字を区別することについて話しているのではありません...

  • 私が char (שたとえば) を持っていて、彼がnvarchar - に格納されている場合、何でも保持できます。なぜcollationここに必要なのですか?

  • 私が「FaceBook」で、言語allから文字を保存する機能が必要な場合、照合と nvarchar 列allの関係は何ですか?

前もって感謝します。

4

3 に答える 3

16

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

XMLSQL Server のおよび接頭辞付きの型に格納されている Unicode データはN、単一の文字セットですべての言語のすべての文字を表すことができます (ほとんどの場合、それが目標です)。したがって、NCHAR/ NVARCHARdata の場合 (これはNTEXTもう使用されるべきXMLではなく、Collat​​ion の影響を受けないため除外しています)、Collat​​ion は格納できる文字を変更しません。データの場合、各CHAR照合が特定のコード ページを指しているため、照合は格納できるものに影響を与えます。これにより、値 128 ~ 255 に格納できるものが決まりますVARCHAR

現在、すべての文字に既定の並べ替え順序がありますが、すべての言語と文化で機能するとは限りません。一部/多く/すべての文字を共有する多くの言語がありますが、それらの並べ替え方法には異なる規則があります。たとえば、文字「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」に相当するのはデンマーク語だけです。ただし、「å」は 1 つの「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)を調べてください。上記の例はそのドキュメントの例に基づいていますが、UCA のすべてのルールが実装されているとは思いません。特に、Windows 照合順序 (で始まらない照合順序SQL_) は Unicode 5.0 または 6.0 に基づいているため、どちらに依存するかは異なります。使用している OS と、インストールされている .NET Framework のバージョン (詳細については、SortVersionを参照してください)。

それがCollat​​ionsの機能です。利用可能なすべての照合順序を表示する場合は、次を実行します。

SELECT [name] FROM sys.fn_helpcollations() ORDER BY [name];
于 2015-09-30T19:20:31.940 に答える
6

文字が 1 つの場合、順序はありません。ただし、たとえば PEOPLE の NAMES を注文すると、異なる言語の異なる特殊文字は、照合に応じて異なる順序で並べられます。

最初の照合では大文字と小文字が区別される場合があります - b の前にすべての B を表示します - そして 2 番目の特殊文字には照合に応じた特別なルールがあります。

ドキュメントはそれについてかなり良いです。

于 2012-03-18T08:04:00.163 に答える