照合順序のサポート¶
照合順序では、 テキスト文字列 を比較するための代替ルールを指定することができます。、特定の言語や他のユーザー指定のルールに従ってデータを比較したり並べ替えたりするために使用することができます。
照合順序のサポートの概要¶
以下のセクションでは、照合順序とは何か、また文字列を比較するときに照合順序をどのように使用するかを説明します。
照合順序の理解¶
Snowflakeのテキスト文字列は UTF-8文字セットを使用して保存され、デフォルトでは、文字列内の文字を表すUnicodeコードに従って文字列が比較されます。
ただし、 UTF-8文字表現に基づいて文字列を比較すると、期待される/必要な動作が得られない場合があります。例:
特定の言語の特殊文字がその言語の順序付け基準に従って並べ替えられない場合、並べ替えは予期しない結果を返す可能性があります。
文字が大文字や小文字であることを無視するなど、他の規則に従って文字列を並べる場合があります。
照合を使用すると、以下に基づいて、文字列の比較に使用するルールを明示的に指定できます。
異なるロケール(つまり、言語ごとに異なる文字セット)。
大文字と小文字の区別(つまり、 UPPER または LOWER 関数を明示的に呼び出して文字列を変換することなく、大文字と小文字を区別して文字列比較を行うかどうか)。
アクセント感度(例:
Z、Ź、Żを同じ文字とみなすか、異なる文字とみなすか)。句読点の感度(つまり、比較に文字のみを使用するか、記号を含むすべての文字を含むか)。たとえば、比較で句読点が区別されない場合、
A-B-CとABCは同等として扱われます。文字列の最初の文字に基づいた並べ替えの設定や、先頭および/または末尾の空白スペースのトリミングなどの追加オプション。
照合順序の用途¶
照合は、次のようなさまざまな操作で使用できます(ただし、これらに限定されません)。
使用状況 |
例 |
リンク |
|---|---|---|
簡単な比較 |
|
|
結合 |
|
|
並び替え |
|
|
Top-Kソート |
|
|
集計 |
|
|
ウィンドウ関数 |
|
|
スカラー関数 |
|
|
集計関数 |
|
|
データクラスタリング |
|
照合順序の制御¶
照合は細かく制御されます。使用する照合を次のように明示的に指定できます。
アカウントレベルのパラメーター DEFAULT_DDL_COLLATION を使用するアカウント。
ALTER DATABASE コマンドを使用して、データベースに追加されたすべてのテーブルのすべての列。
ALTER SCHEMA コマンドを使用して、スキーマに追加されたすべてのテーブルのすべての列。
ALTER TABLE コマンドを使用して、テーブルに追加されたすべての列。
CREATE TABLE コマンドを使用した、テーブル内の個々の列。
SQL ステートメント内の特定の比較(例:
WHERE col1 = col2)。ステートメントに複数の照合が適用される場合、Snowflakeは優先順位に基づいて使用する照合を決定します。優先順位の詳細については、このトピック内の 複数文字列操作での照合順序の優先順位 をご参照ください。
照合順序の SQL 構造¶
照合順序には以下の SQL 構文を使用できます。
テーブル列定義の COLLATE 句¶
オプションの COLLATE 句をテーブル列の定義に追加すると、指定された照合順序が列内のデータに対して実行される比較およびその他の関連操作に使用されることが示されます。
列に COLLATE 句が指定されていない場合、Snowflakeはデフォルトを使用し、 UTF-8文字表現に基づいて文字列を比較します。
また、Snowflakeは照合順序指定に空の文字列(例: COLLATE '')を指定することをサポートしています。これは列の照合順序を指定しないことと同じです。
ただし、優先順位により、列に COLLATE '' を指定しても、 COLLATE 'utf8' を明示的に指定した場合と同じ効果はありません。詳細については、 複数文字列操作での照合順序の優先順位 をご参照ください。
ハイブリッドテーブル </user-guide/tables-hybrid>`で、インデックス付き列のCOLLATE 句を指定することはできません。詳細については、 :ref:`label-hybrid_table_collations_disable をご参照ください。
テーブルの列に照合順序が指定されているかどうかを確認するには、 DESCRIBE TABLE を使用します。DESCRIBE TABLE コマンドを実行すると、照合順序の指定は出力の type 列に表示されます。また、 COLLATION 関数を使用して、特定の列の照合順序を表示することもできます。
COLLATE 関数¶
この COLLATE 関数は、入力文字列式で指定された照合順序を使用します。
中置記法を使用して、この関数を呼び出すこともできます。
この関数は、特定の操作(例: 並べ替え)に対して特定の照合順序を明示的に指定する場合に特に便利ですが、次のような使い方もできます。
サブクエリの SELECT 句で照合を許可し、外部クエリの指定された列に対するすべての操作で照合を使用します。
指定された照合で CTAS を使用してテーブルを作成します。
この例では、英語の大文字と小文字を区別しない照合順序を使用しています。
このコマンドは、ドイツ語の照合を使用して結果をソートしています。
この例では、フランス語の照合順序を使用した列を持つテーブルを作成します。
この例では、infix記法を使用して、フランス語の照合順序を使用する列を持つテーブルを作成します。
COLLATION 関数¶
この COLLATION 関数は、テーブルの列を含む式で使用される照合順序仕様を返します。
式に照合順序が指定されていない場合、関数は NULL を返します。
通常、これを列名で使用する場合、 DISTINCT を使用して、テーブルの各行に対して出力の1行を取得しないようにします。例:
注釈
この関数は、優先順位レベルではなく、照合仕様のみを返します。優先順位の詳細については、このトピック内の 複数文字列操作での照合順序の優先順位 をご参照ください。
照合順序仕様¶
COLLATE 句(テーブル列の場合)または COLLATE 関数(式の場合)を使用する場合、列/式に使用される比較ロジックを決定する照合指定を含める必要があります。
照合仕様は、次の形式のハイフン(-)で区切られた1つ以上の指定子の文字列で構成されます。
'<specifier>[-<specifier> ...]'
次の指定子がサポートされています(詳細については、このトピック内の サポートされている指定子 をご参照ください)。
ロケール
大文字と小文字の区別
アクセント記号の区別
句読点の区別
最初の文字の設定
大文字と小文字の変換
スペーストリミング
指定子は大文字と小文字を区別せず、使用する場合は常に最初にする必要があるロケールを除いて、任意の順序にすることができます。
次のセクションで、照合順序仕様についての詳細を説明します。
仕様例¶
照合仕様の文字列の例を次に示します。
'de':ドイツ語ロケール。'de-ci-pi':ドイツ語ロケール。大文字と小文字の区別なし、句読点の区別なしの比較。'fr_CA-ai':カナダフランス語ロケール。アクセント記号の区別なしの比較。'en_US-trim': US 英語ロケール。比較の前に先頭のスペースと末尾のスペースがトリミングされる比較。
照合順序の指定に空文字列を指定することもできます(例: COLLATE '' や COLLATE(col1, ''))。これは、照合順序を使用しないことを示します。
サポートされている指定子¶
- ロケール:
適用する言語および国の固有ルールを指定します。
language_countryの形式の言語コード(必須)と国コード(オプション)で構成される有効なロケール文字列をサポートします。ロケールの例を次に示します。en- 英語en_US- アメリカ英語fr- フランス語fr_CA- カナダフランス語
さらに、
utf8疑似ロケールは、デフォルトではUnicode順序の使用を指定します。詳細については、 UTF-8 またはロケール照合順序を使用した場合の並べ替えの相違 (このトピック内)をご参照ください。ロケール指定子はオプションですが、使用する場合は、文字列の 最初の 指定子でなければなりません。
Snowflakeがサポートするロケールの全リストについては、 Snowflakeがサポートする照合ロケール をご参照ください。
- 大文字と小文字の区別:
値を比較する際に大文字と小文字を区別するかどうかを決定します。可能な値:
cs- 大文字と小文字を区別する(デフォルト)ci- 大文字と小文字を区別しない
例:
照合 仕様
値
結果
'en-ci'Abc = abcTrue
'en-cs'/enAbc = abcFalse
- アクセント記号の区別:
アクセント記号付き文字を、その基本文字と同等とみなすか、異なる文字とみなすかを決定します。可能な値:
as- アクセントト記号を区別する(デフォルト)ai- アクセント記号を区別しない
例:
照合 仕様
値
結果
注意
'fr-ai'E = ÉTrue
'fr-as'/'fr'E = ÉFalse
'en-ai'a = ąTrue
英語では、これらの文字はアクセントの違いのみを持つものとして扱われるため、アカウントを区別しないように指定すると、値は等しいと比較されます。
'pl-ai'a = ąFalse
ポーランド語では、これらの文字は個別のベース文字として扱われるため、アクセントを区別しないように指定されているかどうかに関係なく、常に等しくないものとして比較されます。
'pl-as'/'pl'a = ąFalse
アクセントの区別と照合の規則は言語に応じて異なります。例えば、一部の言語では照合は常にアクセントを区別するため、アクセントを区別しない照合を指定しても照合をオフにはできません。
- 句読点の区別:
文字以外の文字が重要かどうかを判断します。可能な値:
ps- 句読点を区別します。pi- 句読点を区別しません。
デフォルトはロケール固有であることに注意してください(つまり、句読点の感度が指定されていない場合は、ロケール固有のルールが使用されます)。ほとんどの場合、ルールは
psと同等です。例:
照合 仕様
値
結果
注意
'en-pi'A-B-C = ABCTrue
'en-ps'A-B-C = ABCFalse
- 最初の文字の設定:
並べ替えの際に、大文字を先にするか小文字を先にするかを決定します。可能な値:
fl- 小文字が最初にソートされます。fu- 大文字が最初にソートされます。
デフォルト値はロケール固有です(つまり、値を指定しない場合は、ロケール固有の順序が使用されます)。ほとんどの場合、順序は
flと同等です。また、この指定子は等価比較に影響を与えません。
- 大文字と小文字の変換:
比較の前に文字列が小文字または大文字に変換されます。状況によっては、これはロケール固有の完全な照合よりも高速です。可能な値:
upper- 比較の前に文字列を大文字に変換します。lower- 比較の前に文字列を小文字に変換します。
この指定子にはデフォルト値がありません(つまり、値を指定しないと、どちらの変換も行われません)。
- スペーストリミング:
比較の前に文字列の先頭/末尾のスペースを削除します。この機能は、セマンティクスで SQL CHAR データ型と同等の比較(非常にまれな場合を除く)を実行するのに役立ちます。
可能な値:
trim- 比較の前に先頭と末尾の両方のスペースを削除します。ltrim- 比較の前に先頭のスペースのみを削除します。rtrim- 比較の前に末尾のスペースのみを削除します。
この指定子にはデフォルト値がありません(つまり、値を指定しないと、トリミングは行われません)。
例:
照合 仕様
値
結果
注意
'en-trim'__ABC_ = ABCTrue
例を示すために、ここではアンダースコア文字は空白スペースを表しています。
'en-ltrim'__ABC_ = ABCFalse
'en-rtrim'__ABC_ = ABCFalse
'en'__ABC_ = ABCFalse
照合順序の実装の詳細¶
次のセクションで、照合順序のサポートについての詳細を説明します。
大文字と小文字を区別しない比較¶
以下のセクションでは、大文字と小文字を区別しない比較について説明します。
大文字の文字列と元の文字列を比較したときの相違¶
一部の言語では、2つの小文字と対応する大文字が同一である場合があります。たとえば、一部の言語は、ドット付きとドットなしの小文字 I (例: i と ı)の両方をサポートします。文字列を大文字に強制すると、比較に影響します。
次の例は、その違いを示しています。
テーブルを作成します。
データをクエリします。
文字の重み¶
Snowflakeは、次の 照合仕様 をサポートしています。
ICU (Unicode用の国際化コンポーネント)。
Snowflake固有の照合順序指定(例:
upperやlower)。
ICU で定義された大文字と小文字を区別しない比較操作の場合、Snowflakeは Unicode照合アルゴリズム(UCA) に従い、Unicode文字の3次の重みではなく、1次および2次の重みのみを考慮します。3次の重みのみが異なる文字は、同一として扱われます。たとえば、 en-ci 照合仕様を使用すると、スペースと改行なしスペースは同一であると見なされます。
UTF-8 またはロケール照合順序を使用した場合の並べ替えの相違¶
文字列は常に内部的にSnowflakeの UTF-8に保存され、 UTF-8でサポートされているすべての言語のすべての文字を表すことができます。したがって、照合順序が指定されていない場合の動作は、 UTF-8照合順序(つまり、 'utf8')と同じです。
Snowflakeでは、 'utf8' と 'bin' は同等の照合仕様です。ただし、これらの指定を1つの式に混在させることはできません。例えば、次のクエリはエラーを返します。
UTF-8照合は、文字のアルファベット順ではなく、文字の数値表現に基づいています。
これは、各 ASCII 文字を序数値で並べ替えることに似ています。大文字は序数値が小文字よりも小さいため、注意が必要です。
A = 65B = 66...a = 97b = 98...その結果、
UTF-8の順序で並べ替えると、すべての大文字がすべての小文字の前に返されます。
A、B、 ... 、Y、Z、 ... 、a、b、 ... 、y、z対照的に、
'en'照合仕様は( UTF-8内部表現を使用する代わりに)アルファベット順に並べ替えられ、Bとbの両方の前にAとaの両方が返されます。a、A、b、B、 ...
さらに、 cs と ci の大文字と小文字の区別指定子の違いは、並べ替えに影響します。
cs(大文字と小文字を区別する)は、常に同じ文字の大文字バージョンの前に小文字バージョンの文字を返します。例えば、'en-cs'を使用する場合:a、A、b、B、 ...デフォルトでは大文字と小文字が区別されるため、
'en-cs'と'en'は同等です。ci(大文字と小文字を区別しない)は、大文字と小文字の文字を相互にランダムに返しますが、それ以降の大文字と小文字のバージョン両方の前になります。たとえば、'en-ci'を使用する場合、A、a、b、B、 ...
一部のアルファベット以外の文字は、照合設定に応じて異なる方法でソートできます。次のコード例は、プラス文字(+)とマイナス文字(-)が、異なる照合設定に対して異なる方法でソートされていることを示しています。
テーブルを作成します。
データをクエリします。
複数文字列操作での照合順序の優先順位¶
2つ(またはそれ以上)の文字列で操作を実行すると、異なる文字列に対して異なる照合が指定される場合があります。適用する照合の決定は、各入力に対して照合が指定された方法と、各指定子の優先順位によって異なります。
次の3つの優先レベルがあります(最高から最低まで)。
- 関数:
照合は、 SQL ステートメントで COLLATE 関数 関数を使用して指定されます。
- 列:
列の定義で照合が指定されました。
- なし:
特定の式/列に照合順序が指定されていない/使用されていなかったか、空の指定を持つ照合順序が使用されている/使用されていた(例:
COLLATE(col1, '')またはcol1 STRING COLLATE '')。
使用する照合を決定するときに、優先順位が 最高 の照合仕様が使用されます。複数の照合が指定され、それらの優先レベルが同じ場合、それらの値が比較され、等しくない場合、エラーが返されます。
例えば、次の列レベルの照合仕様を持つテーブルについて考えます。
2つの文字列を比較するステートメントでテーブルが使用される場合、照合は次のように適用されます。
この比較では、
col2_frの優先順位がcol1の優先順位より高いため、'fr'照合順序を使用します。この比較では、
'en'の照合順序を使用します。これは、ステートメントで明示的に指定されているためで、col2_frの照合順序よりも優先されます。この比較は、式が同じ優先順位レベルで異なる照合を持つため、エラーを返します。
この比較では、
col2_frの照合順序が削除されたため、'de'の照合順序を使用します。この比較は、式が同じ優先順位レベルで異なる照合を持つため、エラーを返します。
明示的な照合順序は、照合順序を指定しない場合よりも優先順位が高いため、空文字列を指定すること(あるいは照合順序を指定しないこと)は、 'utf8' 照合順序を明示的に指定することとは異なります。次のコード例にある最後の2つのステートメントは、その違いを示しています。
例えば、次の列レベルの照合仕様を持つテーブルについて考えます。
2つの文字列を比較するステートメントでテーブルが使用される場合、照合は次のように適用されます。
s1には照合順序がなく、'utf8'がデフォルトであるため、この比較では'utf8'を使用します。s1には照合順序がなく、s2には明示的な照合順序'utf8'があるため、この比較では'utf8'を使用しますs1には照合順序がなく、s3には明示的なfr照合順序があるため、この例はエラーなしで実行され、明示的な照合順序が優先されます。s2、s3、同じ優先度で指定された照合順序が異なるため、この比較はエラーとなります。
組み込み関数での照合順序の限定サポート¶
照合は、文字列関数のサブセットでのみサポートされています。照合を実装することが合理的に期待できるが、照合をまだサポートしていない関数は、照合で使用するとエラーを返します。これらのエラーメッセージは、 COLLATE 関数を呼び出すときだけでなく、その列を作成した CREATE TABLE または ALTER TABLE ステートメントで照合されると定義された列で文字列関数を呼び出すときにも表示されます。
照合順序をサポートする関数¶
これらの関数は照合をサポートします。
ILIKE ANY (一部のサポート)
LENGTH, LEN (影響なしでサポート)
LIKE ALL (一部のサポート)
LIKE ANY (一部のサポート)
SUBSTR , SUBSTRING (影響なしでサポート)
これらの関数の一部には、照合での使用に制限があります。情報については、特定の各機能のドキュメントをご参照ください。
このリストは、経時的に拡大する可能性があります。
注意
|| (連結)や LIKE など、 SQL の演算子や述語のいくつかは関数として実装されています(LIKE() や CONCAT() など、関数としても利用できます)。述語または演算子が関数として実装され、その関数が照合をサポートしていない場合、述語または演算子は照合をサポートしません。
照合順序の制限 もご参照ください。
照合順序の使用におけるパフォーマンスへの影響¶
照合の使用は、さまざまなデータベース操作のパフォーマンスに影響を与える可能性があります。
照合順序の使用に関する追加の考慮事項¶
名前が類似しているにもかかわらず、次の照合関数は異なる結果を返します。
照合仕様の列では、照合のロケールにない文字を使用できます。これは、並べ替えに影響する可能性があります。
例えば、列が
COLLATE 'en'句で作成された場合、列のデータには英語以外の文字Éを含めることができます。この状況では、文字ÉはEの近くに並べ替えられます。意味のない場合がある照合操作を指定できます。
例えば、ドイツ語の照合を使用してポーランド語のデータをフランス語のデータと比較するように指定できます。
ただし、予期しない結果または意図しない結果を返す可能性があるため、この機能をこの方法で使用することをSnowflakeは 推奨しません 。
テーブルの列が定義されると、その列の照合順序は変更できません。つまり、 CREATE TABLE ステートメントを使用して特定の照合で列が作成された後、 ALTER TABLE を使用した照合の変更はできません。
ただし、列を参照する SELECT ステートメントなどの DML ステートメントで別の照合を指定できます。
When you create a view using the CREATE VIEW command, the view's columns inherit the collation specifications of the columns in the source tables.
ci と upper / lower の相違¶
upper と lower 照合順序仕様は、文字列の比較とソート時に ci 照合順序仕様よりも良いパフォーマンスを提供することができます。しかし、 upper と lower には、次のセクションで説明するように、 ci と若干異なる効果があります。
幅、スペース、スクリプトの比較の相違¶
文字列の比較の際、 ci 照合順序仕様は、文字の異なる視覚表現が同じ文字を指す可能性があることを認識し、それに従って扱います。より効率的な比較を可能にするために、 upper と lower の照合順序仕様は、文字のこれらの異なる視覚表現を同じ文字として認識しません。
具体的には、 ci 照合順序仕様は以下に挙げるいくつかのカテゴリの違いを無視しますが、 upper と lower の照合順序仕様はそれらを無視しません。
以下のセクションでは、これらの相違を説明する例を挙げています。
注釈
全角文字と半角文字の比較動作はロケールに依存する可能性があります。
幅の異なる文字の比較例¶
different_widths という名前のテーブルを作成し、異なる幅の文字を含む行を挿入します。
次のクエリは、 ci 照合順序仕様が、文字を比較する際に1つの異なる値を検出することを示しています。upper と lower の照合順序仕様は、文字を比較する際に2つの異なる値を検索します。
ci 照合順序仕様は幅と大文字小文字の相違を無視します。upper と lower の照合順序仕様は大文字小文字の相違を無視するのみであり、半角文字は全角文字とは異なる文字とみなされます。
半角小文字 a は半角大文字 A と同じとみなされ、全角小文字 a は全角大文字 A と同じとみなされます。したがって、 upper と lower の照合順序仕様では、2つの異なる値が検出されます。
異なるタイプのスペースの比較例¶
different_whitespaces という名前のテーブルを作成し、異なるタイプのスペースを持つ行を挿入します。
次のクエリは、 ci 照合順序仕様が、スペースを比較するときに1つの明確な値を検出することを示しています。upper と lower の照合順序仕様では、スペースを比較する際に5つの異なる値が検出されます。
異なるスクリプトを持つ文字の比較例¶
different_scripts という名前のテーブルを作成し、異なるスクリプトを使用する文字を含む行を挿入します。
次のクエリは、 ci 照合順序仕様が文字を比較する際に1つの明確な値を検出することを示しています。upper と lower の照合順序仕様では、文字を比較する際に6つの異なる値が検出されます。
無視できるコードポイントの処理の相違¶
Unicode照合順序アルゴリズムは、照合順序要素(コードポイント)は 無視できる と指定しており、これは文字列の比較と並べ替えの際にコードポイントが考慮されないことを意味します。
ci照合順序仕様により、これらのコードポイントは無視されます。このため、無視できるコードポイントの検索や置換が困難になる可能性があります。upperとlowerの照合順序仕様では、これらのコードポイントは無視されません。
たとえば、コードポイント U+0001 は無視できます。このコードポイントを en-ci 照合順序指定で空文字列と比較すると、 U+0001 は無視されるため、結果は TRUE になります。
一方、 upper または lower 照合順序仕様を使用する場合、 U+0001 は無視されないため、結果は FALSE になります。
同様に、文字列からこのコードポイントを削除するために REPLACE 関数を呼び出すとします。en-ci 照合順序仕様を使用する場合、 U+0001 は無視されるため、この関数はコードポイントを削除しません。
次の例に示すように、 REPLACE 関数が返す文字列は、 U+0001 文字を削除しないため、関数に渡された文字列と同じ長さになります。
一方、照合順序に upper または lower 照合順序仕様を使用する場合、この関数は文字列からコードポイントを削除し、より短い文字列を返します。
異なるコードポイントで文字が表現されている場合の相違¶
Unicodeでは、 異なるコードポイント列が同じ文字を表すことができます。たとえば、DialytikaとTonosのあるギリシャ小文字イオタは、コードポイント U+0390 のある 合成済み文字 、または分解済み文字のコードポイント U+03b9 U+0308 U+0301 のシーケンスで表すことができます。
ci 照合順序仕様を使用する場合、1つの文字に対する異なるコードポイントシーケンスは同じ文字として扱われます。たとえば、コードポイント U+0390 とコードポイント U+03b9 U+0308 U+0301 のシーケンスは等価として扱われます。
upper と lower 照合順序仕様のパフォーマンスを向上させるために、シーケンスは同じようには扱われません。2つのコードポイントのシーケンスは、大文字または小文字に変換された後に同じバイナリ表現になる場合にのみ、等価とみなされます。
たとえば、 upper 仕様をコードポイント U+0390 とコードポイント U+03b9 U+0308 U+0301 のシーケンスと合わせて使用すると、等価として扱われます。
lower 仕様を使用すると、文字は不等価になります。
このような相違は、 upper (lower ではなく)を使用すると、こうした相違が発生する可能性が小さくなります。これは、小文字の合成コードポイントが100個以上ある場合に比べて、大文字の合成コードポイントは1個(U+0130)しかないためです。
単一文字を表すコードポイントのシーケンスとの相違¶
コードポイントのシーケンスが単一文字を表す場合、 ci 照合順序仕様は、シーケンスが単一文字を表すことを認識し、シーケンス内の個々のコードポイントを一致させません。
たとえば、コードポイント U+03b9 U+0308 U+0301 のシーケンスは単一文字(DialytikaとTonosのあるギリシャ小文字イオタと)を表します。U+0308 と U+0301 は、 U+03b9 に適用されるアクセントを表します。
ci 照合順序仕様の場合、シーケンス U+03b9 U+0308 が U+03b9 または U+0308 を含むかどうかを判断するために CONTAINS 関数を使用すると、 U+03b9 U+0308 シーケンスは単一文字として扱われるため、関数は FALSE を返します。
パフォーマンスを向上させるために、 upper と lower 仕様はこれらのシーケンスを単一文字として扱いません。上記の例では、 CONTAINS 関数は TRUE を返しますが、これはこれらの仕様が一連のコードポイントを別々の文字として扱っているからです。
大文字と小文字の変更が複数のコードポイントになる場合の相違¶
いくつかの合成文字では、大文字または小文字のバージョンがコードポイントのシーケンスで表されます。たとえば、ドイツ語の「ß」の大文字は、2つのS文字(SS)のシーケンスです。
ßと SS は等価であるにもかかわらず、 upper 照合順序仕様を使用すると、ßと SS の検索結果は異なります。大文字と小文字の変換によって生成されたシーケンスは、その全体が一致するか、まったく一致しないかのいずれかです。
並べ替え順序の相違¶
upper と lower 照合順序仕様の並べ替えは、 ci 仕様の並べ替えとは動作が異なります。
ci仕様では、文字列は照合順序キーで並べ替えられます。一般的に、照合順序キーは大文字と小文字の区別、アクセントの区別、ロケールなどを考慮することができます。upperとlower仕様では、パフォーマンスを向上させるために、文字列はコードポイントで並べ替えられます。
たとえば、 ASCII の範囲にある文字(+ や - など)は並べ替えが異なります。
別の例として、コードポイントを無視した文字列は異なる順序で並べ替えられます。
さらに、絵文字の並べ替えも異なります。
照合順序の制限¶
照合準には、次の制限が適用されます。
照合順序は、最大 64 MB の文字列に対してのみサポートされます¶
Snowflake VARCHAR データ型は最大 128 MB の文字列をサポートしますが、Snowflakeは 結果の 文字列が 64 MB 以下の場合にのみ照合をサポートします。(一部の照合操作では、文字列が長くなる場合があります。)
UDFs では照合順序はサポートされません¶
Snowflakeは、 UDFs (ユーザー定義関数)との照合をサポートしていません。
UDF からは、照合された文字列値を返すことはできません。サーバーは、実際の戻り型が宣言された戻り型と互換性のない場合にエラーを発生します。
照合された文字列値を UDF に渡す場合、照合情報は渡されません。UDF は、文字列を照合されていない文字列と見なします。
VARIANT 、 ARRAY、または OBJECT の文字列に対する照合順序はサポートされません¶
VARIANT 、 OBJECT 、または ARRAY 内に格納されている文字列には、照合仕様が含まれていません。したがって、次のようになります。
これらの値の比較では、常に
'utf8'照合順序が使用されます。照合仕様を持つ VARCHAR 値を使用して、 ARRAY、 OBJECT、または VARIANT 値を構成する場合、照合仕様は保持されません。
ユーザーは値を抽出し、 VARCHAR にキャストし、照合仕様を追加することで、 ARRAY、 OBJECT、または VARIANT 内に格納されている値を比較できます。例:
クリーンルームはデフォルトの照合順序のみをサポート¶
クリーンルームは、アカウントレベルでのデフォルト照合順序のみをサポートしています。これは、 SHOW PARAMETERS LIKE 'DEFAULT_DDL_COLLATION' IN ACCOUNT を実行すると確認できます。
照合順序例¶
次のステートメントは、列ごとに異なる照合を使用するテーブルを作成します。
注釈
照合順序は、格納できる文字のセットには影響しません。Snowflakeは、 UTF-8文字をすべてサポートしています。
表の次のクエリは、期待される値を示しています。
次のクエリは、文字 ñ が n と一致しないため、一致を検出しません。
照合順序を変更しても、関連はあるが等しくない文字(例: ñ と n)は等しいものとして扱われません。
英語フレーズのみが次の理由で True を返す可能性があります。
非連結の比較はアクセントを無視しません。
utf8照合比較はアクセントを無視しません。en-aiとes-aiの照合比較ではアクセント記号は無視されますが、スペイン語ではñはアクセント記号付きのnではなく、個々の文字として扱われます。
以下の例は、並べ替え順に対する照合の効果を示しています。
次のクエリは、照合順序を 'es' (スペイン語) から 'utf8' に変更することで、異なる順序で値を返します。
この例は、 COLLATION 関数を使用して、列などの式の照合を表示する方法を示しています。
DESCRIBE TABLE を使用して、テーブルの列に関する照合情報を表示することもできます。