文字列およびバイナリデータ型¶
このトピックでは、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 が続く)として解釈されます。