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

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

このトピックの内容:

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

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

VARCHAR

VARCHAR holds Unicode characters.

When you declare a column of type VARCHAR, you can specify an optional parameter (N), which is the maximum number of characters to store. For example:

create table t1 (v varchar(16777216));

If no length is specified, the default is the maximum allowed length (16,777,216).

Although a VARCHAR's maximum length is specified in characters, a VARCHAR is also limited to a maximum number of bytes (16,777,216 (16MB)). The maximum number of Unicode characters that can be stored in a VARCHAR column is shown below:

Single-byte

16,777,216.

Multi-byte

Between 8,388,608 (2 bytes per character) and 4,194,304 (4 bytes per character).

For example, if you declare a column as VARCHAR(16777216), the column can hold a maximum of 8,388,608 2-byte Unicode characters, even though you specified a maximum length of 16777216.

A column consumes storage for only the amount of actual data stored. For example, a 1-character string in a VARCHAR(16777216) column only consumes a single character.

There is no performance difference between using the full-length VARCHAR declaration VARCHAR(16777216) or a smaller length. Note that in any relational database, SELECT statements in which a WHERE clause references VARCHAR columns or string columns are not as fast as SELECT statements filtered using a date or numeric column condition.

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

CHAR , CHARACTER

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

注釈

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

STRING , TEXT

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文字の概念がないため、長さは常にバイト単位で測定されます。

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

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進数の3種類があります。

エスケープシーケンス

文字表現

'

一重引用符(')文字

"

二重引用符(")文字

\

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

b

バックスペース文字

f

改ページ文字

n

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

r

復帰文字

t

タブ文字

ooo

ASCII 8進表記の文字

xhh

ASCII 16進表記の文字

例:

SELECT $1, $2 FROM
VALUES
('Tab','Hel\tlo'),
('Newline','Hel\nlo'),
('Octal','-\041-'),
('Hexadecimal','-\x21-')
;

+-------------+-----+
| $1          | $2  |
|-------------+-----|
| Tab         | Hel lo     |
| Newline     | Hel |
|             | lo  |
| Octal       | -!- |
| Hexadecimal | -!- |
+-------------+-----+

バックスラッシュでエスケープされた非特殊文字は、単にその文字として解釈されます(例えば、 '\z''z' になります)。

ドル記号付き文字列定数

文字列に多くの引用文字が含まれている場合、文字列定数を一重引用符ではなくドル記号で囲む方が簡単な場合があります。ドル引用符で囲まれた文字列定数は、ドル記号($$)のペアで囲まれた文字列内の文字で構成されます。

例えば、次の文字列定数は同等です。

'string with a \' character'

$$string with a ' character$$

ドル引用符で囲まれた文字列定数には、引用符などの文字を含めることができますが、エスケープする必要はありません。文字列の内容は常に文字通り書き込まれます。文字列定数にダブルドル記号を含めることはできません。

例:

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

+------+-------------------------------------------------------+
| $1   | $2                                                    |
|------+-------------------------------------------------------|
| row1 | a                                                     |
|      |                                           ' \ \t      |
|      |                                           \0x123 z $  |
+------+-------------------------------------------------------+