文字列およびバイナリデータ型¶
このトピックでは、Snowflakeでサポートされているバイナリ文字列を含む文字列/テキストデータ型と、文字列定数/リテラルでサポートされている形式について説明します。
テキスト文字列のデータ型¶
Snowflakeは、テキスト(つまり文字)文字列について以下のデータ型をサポートしています。
VARCHAR¶
VARCHAR 値は、Unicode 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(134217728));
長さが指定されていない場合、デフォルトは16,777,216です。
VARCHAR 値の最大長は 文字 で指定されていますが、VARCHAR 値も最大134,217,728 バイト (128 MB)に制限されています。VARCHAR 列に保存できるUnicode文字の最大数は以下のとおりです。
- シングルバイト:
- 134,217,728 
- マルチバイト:
- 67,108,864(1文字あたり2バイト)と33,554,432(1文字あたり4バイト)の間。 
たとえば、列を VARCHAR(134217728) として宣言すると、最大長を 134217728 に指定した場合でも、列は最大67,108,864の2バイトUnicode文字を保持できます。
VARCHAR 列の最大長を選択するときは、次の点を考慮してください。
- ストレージ: 列は、保存されている実際のデータ量のストレージのみを消費します。たとえば、 - VARCHAR(134217728)列にある1文字の文字列は、1文字のみを消費します。
- パフォーマンス: 最大長の VARCHAR 宣言 - VARCHAR(134217728)と、それより短い長さを使用した場合のパフォーマンスに違いはありません。- いずれのリレーショナルデータベース内でも、 WHERE 句が VARCHAR 列または文字列列を参照する SELECT ステートメントは、日付または数値列条件を使用してフィルター処理された SELECT ステートメントほど高速ではありません。 
- データを操作するためのツール: 一部の BI/ETL ツールは、ストレージまたはメモリ内の VARCHAR データの最大サイズを定義します。列の最大サイズがわかっている場合は、列を追加するときにサイズを制限できます。 
- 照合: VARCHAR 列に 照合 を指定する場合、許可される文字数は、各文字のバイト数と列の照合仕様によって異なります。 - 照合列の値を比較する場合、 SnowflakeはUnicode照合アルゴリズム(UCA)に従います。このアルゴリズムは、許可される最大文字数に影響を与えます。現在、最大サイズと照合指定で定義された VARCHAR 列では、およそ150万から800万文字が許可されています。 - 例として、次の表は、1文字あたりのバイト数と使用される照合順序仕様に応じて、 - VARCHAR(134217728)列の最大文字数がどのように変化するかを示しています。- 文字あたりのバイト数 - 照合順序仕様 - 許可される最大文字数(概算) - 1バイト - en-ciまたは- en-ci-pi-ai- およそ5600万文字 - 1バイト - en- およそ3200万文字 - 2バイト - en-ci-pi-ai- およそ6400万文字 - 2バイト - en-ciまたは- en-ci-pi- およそ2160万文字 - 2バイト - en- およそ1200万文字 
CHAR, CHARACTER, NCHAR¶
VARCHAR と同義語です。ただし、長さが指定されていない場合は、 CHAR(1) がデフォルトです。
注釈
Snowflakeは現在、一般的な CHAR セマンティクスとは異なり、最大長より短い文字列は最後にスペースが埋め込まれません。
STRING, TEXT, NVARCHAR, NVARCHAR2, CHAR VARYING, NCHAR VARYING¶
VARCHAR と同義です。
テーブル列の文字列の例¶
CREATE OR REPLACE TABLE test_text(
  vm VARCHAR(134217728),
  vd VARCHAR,
  v50 VARCHAR(50),
  cm CHAR(134217728),
  cd CHAR,
  c10 CHAR(10),
  sm STRING(134217728),
  sd STRING,
  s20 STRING(20),
  tm TEXT(134217728),
  td TEXT,
  t30 TEXT(30));
DESC TABLE test_text;
+------+--------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+
| name | type               | kind   | null? | default | primary key | unique key | check | expression | comment | policy name | privacy domain |
|------+--------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------|
| VM   | VARCHAR(134217728) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
| VD   | VARCHAR(16777216)  | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
| V50  | VARCHAR(50)        | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
| CM   | VARCHAR(134217728) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
| CD   | VARCHAR(1)         | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
| C10  | VARCHAR(10)        | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
| SM   | VARCHAR(134217728) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
| SD   | VARCHAR(16777216)  | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
| S20  | VARCHAR(20)        | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
| TM   | VARCHAR(134217728) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
| TD   | VARCHAR(16777216)  | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
| T30  | VARCHAR(30)        | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
+------+--------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+
バイナリ文字列のデータ型¶
Snowflakeは、バイナリ文字列に対して次のデータ型をサポートしています。
BINARY¶
最大長は64 MB(67,108,864バイト)です。VARCHAR とは異なり、 BINARY データ型にはUnicode文字の概念がないため、長さは常にバイト単位で測定されます。
BINARY の値は64 MB に制限されているため、例えば :code:`TO_CHAR(<binary_expression>、HEX)`を使用して16進数文字列に変換すると、128 MB 内に収まります。
BINARY 型の列を宣言する場合は、保存できる最大バイト数であるオプションのパラメーター (N) を指定できます。例:
CREATE TABLE b1 (b BINARY(33554432));
長さが指定されていない場合、デフォルトは8,388,608です。
VARBINARY¶
VARBINARY は、 BINARYと同義語です。
内部表現¶
BINARY データ型は、8ビットバイトのシーケンスを保持します。
Snowflakeが BINARY データ値を表示するとき、Snowflakeは多くの場合、各バイトを2つの16進文字として表します。たとえば、単語「 HELP 」は 48454C50 として表示される場合があります。この場合、「 48 」は ASCII (Unicode)文字の「 H 」に相当する16進数で、「 45 」は「 E 」の文字を表す16進数というように続きます。
BINARY データの入力と表示の詳細については、 バイナリ入出力 をご参照ください。
テーブル列のバイナリ例¶
CREATE OR REPLACE TABLE test_binary(
  bd BINARY,
  b100 BINARY(100),
  vbd VARBINARY);
DESC TABLE test_binary;
+------+-----------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+
| name | type            | kind   | null? | default | primary key | unique key | check | expression | comment | policy name | privacy domain |
|------+-----------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------|
| BD   | BINARY(8388608) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
| B100 | BINARY(100)     | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
| VBD  | BINARY(8388608) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
+------+-----------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+
文字列定数¶
定数 (別名 リテラル)は、固定データ値を指します。Snowflakeの文字列定数は、常に区切り文字で囲む必要があります。Snowflakeは、次のいずれかを使用して文字列定数を区切ることをサポートしています。
一重引用符付き文字列定数¶
文字列定数は、一重引用符区切り文字で囲むことができます(例: 'This is a string')。文字列定数内に一重引用符を含めるには、2つの隣接する一重引用符を入力します(例: '')。
例:
SELECT 'Today''s sales projections', '-''''-';
+------------------------------+----------+
| 'TODAY''S SALES PROJECTIONS' | '-''''-' |
|------------------------------+----------|
| Today's sales projections    | -''-     |
+------------------------------+----------+
注釈
2つの一重引用符は、(必要に応じて)オブジェクト識別子を区切るために使用される二重引用符(")とは 異なります。詳細については、 識別子の要件 をご参照ください。
一重引用符で囲まれた文字列定数のエスケープシーケンス¶
一重引用符またはその他の特殊文字(例: 改行)を一重引用符で囲まれた文字列定数に含めるには、 バックスラッシュエスケープシーケンス を使用してこれらの文字をエスケープする必要があります。バックスラッシュエスケープシーケンスは、バックスラッシュ(\)で始まる文字のシーケンスです。
注釈
文字列に多くの一重引用符、バックスラッシュ、またはその他の特殊文字が含まれている場合は、代わりに ドル引用符で囲まれた文字列定数 を使用して、これらの文字がエスケープされないようにすることができます。
エスケープシーケンスを使用して、 コードポイント (これらの文字に対応する数値)を8進数または16進数で指定することにより、 ASCII 文字を挿入することもできます。たとえば、 ASCII では、スペース文字のコードポイントは32であり、これは16進数で20です。スペースを指定するには、16進数エスケープシーケンス \x20 を使用できます。
エスケープシーケンスを使用して、 \u26c4 などのUnicode文字を挿入することもできます。
次のテーブルに、サポートされているエスケープシーケンスを単純、8進数、16進数、Unicodeの4つのカテゴリでリストします。
エスケープシーケンス
文字表現
単純なエスケープシーケンス
\'一重引用符(
')文字。
\"二重引用符(
")文字。
\\バックスラッシュ(
\)文字。
\bバックスペース文字。
\f改ページ文字。
\n改行(ラインフィード)文字。
\rキャリッジリターン文字。
\tタブ文字。
\0ASCII NUL 文字。
8進数エスケープシーケンス
\ooo8進法の ASCII 文字(つまり、各
oが8進数を表す)。16進数エスケープシーケンス
\xhh16進法の ASCII 文字(つまり、各
hが16進数を表す)。Unicodeエスケープシーケンス
\uhhhh16進法の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             |
+------------------------+---------------+
ドル記号付き文字列定数¶
場合によっては、以下を含む文字列定数を指定する必要があります。
- 一重引用符文字。 
- バックスラッシュ文字(例: 正規表現 内)。 
- 改行文字(例: CREATE PROCEDURE または CREATE FUNCTION で指定するストアドプロシージャまたは関数の本文)。 
このような場合は、文字列の開始と終了を区切るために一重引用符(')ではなくドル記号($$)のペアを使用すると、 これらの文字のエスケープ を回避できます。
ドル引用符で囲まれた文字列定数には、引用符、バックスラッシュ、改行、およびその他の特殊文字(二重ドル記号を除く)をエスケープせずに含めることができます。ドル引用符で囲まれた文字列定数の内容は、常に文字通りに解釈されます。
次の例は、文字列定数を指定する同等の方法です。
| 一重引用符区切り文字の使用例 | 二重ドル記号区切り文字の使用例 | 
|---|---|
| 'string with a \' character'
 | $$string with a ' character$$
 | 
| 'regular expression with \\ characters: \\d{2}-\\d{3}-\\d{4}'
 | $$regular expression with \ characters: \d{2}-\d{3}-\d{4}$$
 | 
| 'string with a newline\ncharacter'
 | $$string with a newline
character$$
 | 
次の例では、改行といくつかの エスケープシーケンス を含むドル引用符で囲まれた文字列定数を使用しています。
SELECT $1, $2 FROM VALUES (
  'row1',
  $$a
                                  ' \ \t
                                  \x21 z $ $$);
+------+---------------------------------------------+
| $1   | $2                                          |
|------+---------------------------------------------|
| row1 | a                                           |
|      |                                   ' \ \t    |
|      |                                   \x21 z $  |
+------+---------------------------------------------+
この例では、エスケープシーケンスが、エスケープシーケンスとしてではなく、個別の文字(例: バックスラッシュの後に t が続く)として解釈されます。