バイナリデータの使用¶
BINARY データ型の有用性と柔軟性は、例を使うと最もよく実証できます。このトピックでは、 BINARY データ型とその3つのエンコードスキームに関連するタスクの実用的な例を示します。
このトピックの内容:
16進数とBase64の間の変換¶
BINARY データ型は、16進数の文字列とBase64の文字列の間で変換する際の中間ステップとして使用できます。
TO_CHAR , TO_VARCHAR を使用して16進数からBase64に変換するには、
SELECT c1, to_char(to_binary(c1, 'hex'), 'base64') FROM hex_strings;
+----------------------+-----------------------------------------+
| C1 | TO_CHAR(TO_BINARY(C1, 'HEX'), 'BASE64') |
|----------------------+-----------------------------------------|
| df32ede209ed5a4e3c25 | 3zLt4gntWk48JQ== |
| AB4F3C421B | q088Qhs= |
| 9324df2ecc54 | kyTfLsxU |
+----------------------+-----------------------------------------+
Base64から16進数に変換するには、
SELECT c1, to_char(to_binary(c1, 'base64'), 'hex') FROM base64_strings;
+------------------+-----------------------------------------+
| C1 | TO_CHAR(TO_BINARY(C1, 'BASE64'), 'HEX') |
|------------------+-----------------------------------------|
| 3zLt4gntWk48JQ== | DF32EDE209ED5A4E3C25 |
| q088Qhs= | AB4F3C421B |
| kyTfLsxU | 9324DF2ECC54 |
+------------------+-----------------------------------------+
テキストと UTF-8バイトの間の変換¶
Snowflakeの文字列はUnicode文字で構成され、バイナリ値はバイトで構成されます。文字列を UTF-8形式のバイナリ値に変換することにより、Unicode文字を構成するバイトを直接操作できます。
TO_BINARY を使用して、1文字の文字列をバイト単位の UTF-8表現に変換します。
SELECT c1, to_binary(c1, 'utf-8') FROM characters;
+----+------------------------+
| C1 | TO_BINARY(C1, 'UTF-8') |
|----+------------------------|
| a | 61 |
| é | C3A9 |
| ❄ | E29D84 |
| π | CF80 |
+----+------------------------+
TO_CHAR , TO_VARCHAR を使用して、 UTF-8バイトシーケンスを文字列に変換します。
SELECT to_char(X'41424320E29D84', 'utf-8');
+-------------------------------------+
| TO_CHAR(X'41424320E29D84', 'UTF-8') |
|-------------------------------------|
| ABC ❄ |
+-------------------------------------+
Base64で MD5 ダイジェストを取得する¶
バイナリ MD5 ダイジェストからBase64 文字列の変換に TO_CHAR , TO_VARCHAR を使用するには、
SELECT to_char(md5_binary(c1), 'base64') FROM variants;
+----------+-----------------------------------+
| C1 | TO_CHAR(MD5_BINARY(C1), 'BASE64') |
|----------+-----------------------------------|
| 3 | 7MvIfktc4v4oMI/Z8qe68w== |
| 45 | bINJzHJgrmLjsTloMag5jw== |
| "abcdef" | 6AtQFwmJUPxYqtg8jBSXjg== |
| "côté" | H6G3w1nEJsUY4Do1BFp2tw== |
+----------+-----------------------------------+
可変形式のバイナリへの変換¶
文字列から抽出されたバイナリ形式を使用して、文字列をバイナリ値に変換します。このステートメントには、 TRY_TO_BINARY および SPLIT_PART 関数が含まれています。
SELECT c1, try_to_binary(split_part(c1, ':', 2), split_part(c1, ':', 1)) AS binary_value FROM strings;
+-------------------------+----------------------+
| C1 | BINARY_VALUE |
|-------------------------+----------------------|
| hex:AB4F3C421B | AB4F3C421B |
| base64:c25vd2ZsYWtlCg== | 736E6F77666C616B650A |
| utf8:côté | 63C3B474C3A9 |
| ???:abc | NULL |
+-------------------------+----------------------+
変換のために複数の形式を試します。
SELECT c1, coalesce(
x'00' || try_to_binary(c1, 'hex'),
x'01' || try_to_binary(c1, 'base64'),
x'02' || try_to_binary(c1, 'utf-8')) AS binary_value FROM strings;
+------------------+------------------------+
| C1 | BINARY_VALUE |
|------------------+------------------------|
| ab4f3c421b | 00AB4F3C421B |
| c25vd2ZsYWtlCg== | 01736E6F77666C616B650A |
| côté | 0263C3B474C3A9 |
| 1100 | 001100 |
+------------------+------------------------+
注釈
上記のクエリは TRY_TO_BINARY を使用するため、形式が認識されない場合、または指定された形式で文字列を解析できない場合、結果は NULL になります。
SUBSTR , SUBSTRING および DECODE を使用して、前の例の結果を文字列に変換し直します。
SELECT c1, to_char(
substr(c1, 2),
decode(substr(c1, 1, 1), x'00', 'hex', x'01', 'base64', x'02', 'utf-8')) AS string_value
FROM bin;
+------------------------+------------------+
| C1 | STRING_VALUE |
|------------------------+------------------|
| 00AB4F3C421B | AB4F3C421B |
| 01736E6F77666C616B650A | c25vd2ZsYWtlCg== |
| 0263C3B474C3A9 | côté |
| 001100 | 1100 |
+------------------------+------------------+
JavaScript UDF のカスタムデコーディング¶
BINARY データ型により、任意のデータを保存できます。JavaScript UDFs は Uint8Array
を介してデータ型をサポートしているため( JavaScript UDFs の紹介 を参照)、 JavaScriptでカスタムデコードロジックを実装できます。これは最も効率的な作業方法ではありませんが、非常に強力です。
最初のバイトに基づいてデコードする関数を作成します。
CREATE FUNCTION my_decoder (B binary) RETURNS variant LANGUAGE javascript AS '
if (B[0] == 0) {
var number = 0;
for (var i = 1; i < B.length; i++) {
number = number * 256 + B[i];
}
return number;
}
if (B[0] == 1) {
var str = "";
for (var i = 1; i < B.length; i++) {
str += String.fromCharCode(B[i]);
}
return str;
}
return null;';
SELECT c1, my_decoder(c1) FROM bin;
+----------------+----------------+
| C1 | MY_DECODER(C1) |
|----------------+----------------|
| 002A | 42 |
| 0148656C6C6F21 | "Hello!" |
| 00FFFF | 65535 |
| 020B1701 | null |
+----------------+----------------+