文字列およびバイナリデータ型¶
このトピックでは、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 データの入力と表示の詳細については、 バイナリ入出力 をご参照ください。
テーブル列のバイナリ例¶
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
ASCII NUL 文字。
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」が続く)として解釈されます。