文字列およびバイナリデータ型

このトピックでは、Snowflakeでサポートされているバイナリ文字列を含む文字列/テキストデータ型と、文字列定数/リテラルでサポートされている形式について説明します。

このトピックの内容:

テキスト文字列のデータ型

Snowflakeは、テキスト(文字)文字列に対して次のデータ型をサポートしています。

VARCHAR

VARCHAR は、 UTF-8文字を保持します。

注釈

Snowflake以外の一部のシステムでは、 CHAR や VARCHAR などのデータ型は ASCII を格納し、 NCHAR や NVARCHAR などのデータ型はUnicodeを格納します。

Snowflakeでは、 VARCHAR および他のすべての文字列データ型は、Unicode UTF-8文字を格納します。CHAR と NCHAR のデータ型の間におけるUnicodeの処理に関して違いはありません。NCHAR などの同義語は、主に DDL コマンドをSnowflakeに移植する際の構文の互換性のためのものです。

VARCHAR 型の列を宣言する場合は、保存できる最大文字数であるオプションのパラメーター (N) を指定できます。例:

create table t1 (v varchar(16777216));
Copy

長さが指定されていない場合、デフォルトは最大許容長(16,777,216)です。

VARCHAR の最大長は 文字数 で指定されますが、 VARCHAR には、最大 バイト数 (16,777,216(16 MB))の制限もあります。VARCHAR 列に保存できるUnicode文字の最大数を以下に示します。

シングルバイト:

16,777,216。

マルチバイト:

8,388,608(1文字あたり2バイト)と4,194,304(1文字あたり4バイト)の間。

たとえば、列を VARCHAR (16777216)として宣言すると、最大長を16777216に指定した場合でも、列は最大8,388,608の2バイトUnicode文字を保持できます。

VARCHAR 列の最大長を選択するときは、次の点を考慮してください。

  • ストレージ: 列は、保存されている実際のデータ量のストレージのみを消費します。たとえば、 VARCHAR(16777216)列にある1文字の文字列は、1文字のみを消費します。

  • パフォーマンス: 最大長の VARCHAR 宣言 VARCHAR(16777216)と、それより短い長さを使用した場合のパフォーマンスに違いはありません。

    リレーショナルデータベースでは、 WHERE 句が VARCHAR 列または文字列列を参照する SELECT ステートメントは、日付または数値列条件を使用してフィルター処理された SELECT ステートメントほど高速ではありません。

  • データを操作するためのツール: 一部の BI/ETL ツールは、ストレージまたはメモリ内の VARCHAR データの最大サイズを定義します。列の最大サイズがわかっている場合は、列を追加するときにサイズを制限できます。

  • 照合: VARCHAR 列に 照合 を指定する場合、許可される文字数は、各文字のバイト数と列の照合仕様によって異なります。

    照合列の値を比較する場合、 SnowflakeはUnicode照合アルゴリズム(UCA)に従います。このアルゴリズムは、許可される最大文字数に影響を与えます。現在、最大サイズと照合指定で定義された VARCHAR 列では、およそ150万から800万文字が許可されています。

    例として、次の表は、1文字あたりのバイト数と使用される照合指定に応じて、 VARCHAR(16777216)列の最大文字数がどのように変化するかを示しています。

    文字あたりのバイト数

    照合仕様

    許可される最大文字数(概算)

    1バイト

    en-ci または en-ci-pi-ai

    および700万文字

    1バイト

    en

    およそ400万文字

    2バイト

    en-ci-pi-ai

    およそ800万文字

    2バイト

    en-ci または en-ci-pi

    およそ270万文字

    2バイト

    en

    およそ150万文字

CHAR , CHARACTER , NCHAR

VARCHAR と同義語です。ただし、長さが指定されていない場合は、 CHAR(1)がデフォルトです。

注釈

Snowflakeは現在、一般的な CHAR セマンティクスとは異なり、最大長より短い文字列は最後にスペースが埋め込まれません。

STRING , TEXT , NVARCHAR , NVARCHAR2 , CHAR VARYING , NCHAR VARYING

VARCHAR と同義です。

テーブル列の文字列の例

CREATE OR REPLACE TABLE test_text(v VARCHAR,
                                  v50 VARCHAR(50),
                                  c CHAR,
                                  c10 CHAR(10),
                                  s STRING,
                                  s20 STRING(20),
                                  t TEXT,
                                  t30 TEXT(30)
                                  );

DESC TABLE test_text;

+------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+
| name | type              | kind   | null? | default | primary key | unique key | check | expression | comment |
|------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------|
| V    | VARCHAR(16777216) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
| V50  | VARCHAR(50)       | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
| C    | VARCHAR(1)        | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
| C10  | VARCHAR(10)       | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
| S    | VARCHAR(16777216) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
| S20  | VARCHAR(20)       | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
| T    | VARCHAR(16777216) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
| T30  | VARCHAR(30)       | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
+------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+
Copy

バイナリ文字列のデータ型

Snowflakeは、バイナリ文字列に対して次のデータ型をサポートしています。

BINARY

最大長は8 MB (8,388,608バイト)です。VARCHAR とは異なり、 BINARY データ型にはUnicode文字の概念がないため、長さは常にバイト単位で測定されます。

(BINARY の値は8 MB に制限されているため、たとえば TO_CHAR(<バイナリ式>, 'HEX') を介して16進数文字列に変換すると、16 MB 内に収まります。)

長さが指定されていない場合、デフォルトは最大長になっています。

VARBINARY

VARBINARY は、 BINARYと同義語です。

内部表現

BINARY データ型は、8ビットバイトのシーケンスを保持します。

SnowflakeがBINARYデータ値を表示するとき、Snowflakeは多くの場合、各バイトを2つの16進文字として表します。たとえば、単語「HELP」は 48454C50 として表示される場合があります。「48」は ASCII (Unicode)文字「H」に相当する16進数で、「45」は「E」などの文字を表す16進数です。

BINARY データの入力と表示の詳細については、 Binary Input and Output をご参照ください。

テーブル列のバイナリ例

CREATE OR REPLACE TABLE test_binary(b BINARY,
                                    b100 BINARY(100),
                                    vb VARBINARY
                                    );

DESC TABLE test_binary;

+------+-----------------+--------+-------+---------+-------------+------------+-------+------------+---------+
| name | type            | kind   | null? | default | primary key | unique key | check | expression | comment |
|------+-----------------+--------+-------+---------+-------------+------------+-------+------------+---------|
| B    | BINARY(8388608) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
| B100 | BINARY(100)     | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
| VB   | BINARY(8388608) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
+------+-----------------+--------+-------+---------+-------------+------------+-------+------------+---------+
Copy

文字列定数

定数 (別名 リテラル)は、固定データ値を指します。Snowflakeの文字列定数は、常に区切り文字で囲む必要があります。Snowflakeは、次のいずれかを使用して文字列定数を区切ることをサポートしています。

一重引用符付き文字列定数

文字列定数は、一重引用符区切り文字で囲むことができます(例: 'This is a string')。文字列定数内に一重引用符を含めるには、2つの隣接する一重引用符を入力します(例: '')。

例:

SELECT 'Today''s sales projections', '-''''-';

+------------------------------+----------+
| 'TODAY''S SALES PROJECTIONS' | '-''''-' |
|------------------------------+----------|
| Today's sales projections    | -''-     |
+------------------------------+----------+
Copy

注釈

2つの一重引用符は、(必要に応じて)オブジェクト識別子を区切るために使用される二重引用符(")とは 異なります。詳細については、 識別子の要件 をご参照ください。

一重引用符で囲まれた文字列定数のエスケープシーケンス

一重引用符またはその他の特殊文字(例: 改行)を一重引用符で囲まれた文字列定数に含めるには、 バックスラッシュエスケープシーケンス を使用してこれらの文字をエスケープする必要があります。バックスラッシュエスケープシーケンスは、バックスラッシュ(\)で始まる文字のシーケンスです。

注釈

文字列に多くの一重引用符、バックスラッシュ、またはその他の特殊文字が含まれている場合は、代わりに ドル引用符で囲まれた文字列定数 を使用して、これらの文字がエスケープされないようにすることができます。

エスケープシーケンスを使用して、 コードポイント (これらの文字に対応する数値)を8進数または16進数で指定することにより、 ASCII 文字を挿入することもできます。たとえば、 ASCII では、スペース文字のコードポイントは32であり、これは16進数で20です。スペースを指定するには、16進数エスケープシーケンス \x20 を使用できます。

エスケープシーケンスを使用して、 \u26c4 などのUnicode文字を挿入することもできます。

次のテーブルに、サポートされているエスケープシーケンスを単純、8進数、16進数、Unicodeの4つのカテゴリでリストします。

エスケープシーケンス

文字表現

単純なエスケープシーケンス

\'

一重引用符(')文字

\"

二重引用符(")文字

\\

バックスラッシュ(\)文字

\b

バックスペース文字

\f

改ページ文字

\n

改行(ラインフィード)文字

\r

キャリッジリターン文字

\t

タブ文字

\0

ASCIINUL 文字

8進数エスケープシーケンス

\ooo

8進表記の ASCII 文字(つまり、各 o は8進数を表します)。

16進数エスケープシーケンス

\xhh

16進表記の ASCII 文字(つまり、各 h は16進数を表します)。

Unicodeエスケープシーケンス

\uhhhh

16進表記のUnicode文字(つまり、各 h は16進数を表します)。16進数の桁数は4でなければなりません。

上記のテーブルに示すように、文字列定数にバックスラッシュ文字を含める必要がある場合(例: Windowsパスの C:\ または 正規表現\d)は、2番目のバックスラッシュでバックスラッシュをエスケープする必要があります。たとえば、文字列定数の正規表現に \d を含めるには、 \\d を使用する必要があります。

上記以外のシーケンスでバックスラッシュが使用されている場合、バックスラッシュは無視されることに注意してください。たとえば、文字のシーケンス '\z''z' として解釈されます。

次の例は、バックスラッシュのエスケープシーケンスを使用する方法を示しています。これには、以下を指定する例が含まれます。

  • タブ文字

  • 改行

  • バックスラッシュ

  • 感嘆符の8進数および16進数のエスケープシーケンス(コードポイント33、8進数では \041、16進数では \x21

  • 雪だるまの小さな画像のUnicodeエスケープシーケンス

  • 有効なエスケープシーケンスではないもの

    SELECT $1, $2 FROM
    VALUES
    ('Tab','Hello\tWorld'),
    ('Newline','Hello\nWorld'),
    ('Backslash','C:\\user'),
    ('Octal','-\041-'),
    ('Hexadecimal','-\x21-'),
    ('Unicode','-\u26c4-'),
    ('Not an escape sequence', '\z')
    ;
    
    +------------------------+---------------+
    | $1                     | $2            |
    |------------------------+---------------|
    | Tab                    | Hello   World |
    | Newline                | Hello         |
    |                        | World         |
    | Backslash              | C:\user       |
    | Octal                  | -!-           |
    | Hexadecimal            | -!-           |
    | Unicode                | -⛄-          |
    | Not an escape sequence | z             |
    +------------------------+---------------+
    
    Copy

ドル記号付き文字列定数

場合によっては、以下を含む文字列定数を指定する必要があります。

  • 一重引用符文字。

  • バックスラッシュ文字(例: 正規表現 内)。

  • 改行文字(例: CREATE PROCEDURE または CREATE FUNCTION で指定するストアドプロシージャまたは関数の本体)。

このような場合は、文字列の開始と終了を区切るために一重引用符(')ではなくドル記号($$)のペアを使用すると、 これらの文字のエスケープ を回避できます。

ドル引用符で囲まれた文字列定数には、引用符、バックスラッシュ、改行、およびその他の特殊文字(二重ドル記号を除く)をエスケープせずに含めることができます。ドル引用符で囲まれた文字列定数の内容は、常に文字通りに解釈されます。

次の例は、文字列定数を指定する同等の方法です。

一重引用符区切り文字の使用例

二重ドル記号区切り文字の使用例

'string with a \' character'
Copy
$$string with a ' character$$
Copy
'regular expression with \\ characters: \\d{2}-\\d{3}-\\d{4}'
Copy
$$regular expression with \ characters: \d{2}-\d{3}-\d{4}$$
Copy
'string with a newline\\ncharacter'
Copy
$$string with a newline
character$$
Copy

次の例では、改行といくつかの エスケープシーケンス を含むドル引用符で囲まれた文字列定数を使用しています。

SELECT $1, $2 FROM VALUES ('row1', $$a
                                      ' \ \t
                                      \x21 z $ $$);

+------+-------------------------------------------------------+
| $1   | $2                                                    |
|------+-------------------------------------------------------|
| row1 | a                                                     |
|      |                                           ' \ \t      |
|      |                                           \x21 z $    |
+------+-------------------------------------------------------+
Copy

この例では、エスケープシーケンスが、エスケープシーケンスではなく、個別の文字(例: バックスラッシュの後に「t」が続く)としてどのように解釈されるかに注意してください。