文字列およびバイナリデータ型¶
このトピックでは、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));
長さが指定されていない場合、デフォルトは最大許容長(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 |
+------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+
バイナリ文字列のデータ型¶
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 |
+------+-----------------+--------+-------+---------+-------------+------------+-------+------------+---------+
文字列定数¶
定数 (別名 リテラル)は、固定データ値を指します。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
タブ文字
\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 | +------------------------+---------------+
ドル記号付き文字列定数¶
場合によっては、以下を含む文字列定数を指定する必要があります。
一重引用符文字。
バックスラッシュ文字(例: 正規表現 内)。
改行文字(例: 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」が続く)としてどのように解釈されるかに注意してください。