バイナリデータの使用

BINARY データ型の有用性と柔軟性は、例を使うと最もよく実証できます。このトピックでは、 BINARY データ型とその3つのエンコードスキームに関連するタスクの実用的な例を示します。

16進数とBase64の間の変換

BINARY データ型は、16進数の文字列とBase64の文字列の間で変換する際の中間ステップとして使用できます。

TO_CHAR を使用して16進数からBase64に変換するには、

SELECT c1, TO_CHAR(TO_BINARY(c1, 'hex'), 'base64') FROM hex_strings; 
Copy
+----------------------+-----------------------------------------+ | 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; 
Copy
+------------------+-----------------------------------------+ | 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; 
Copy
+----+------------------------+ | C1 | TO_BINARY(C1, 'UTF-8') | |----+------------------------| | a | 61 | | é | C3A9 | | ❄ | E29D84 | | π | CF80 | +----+------------------------+ 

TO_CHAR , TO_VARCHAR を使用して、 UTF-8バイトシーケンスを文字列に変換します。

SELECT TO_CHAR(X'41424320E29D84', 'utf-8'); 
Copy
+-------------------------------------+ | TO_CHAR(X'41424320E29D84', 'UTF-8') | |-------------------------------------| | ABC ❄ | +-------------------------------------+ 

Base64で MD5 ダイジェストを取得する

TO_CHAR を使用してバイナリ MD5 ダイジェストからBase64文字列に変換するには、

SELECT TO_CHAR(MD5_BINARY(c1), 'base64') FROM variants; 
Copy
+----------+-----------------------------------+ | 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; 
Copy
+-------------------------+----------------------+ | 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; 
Copy
+------------------+------------------------+ | C1 | BINARY_VALUE | |------------------+------------------------| | ab4f3c421b | 00AB4F3C421B | | c25vd2ZsYWtlCg== | 01736E6F77666C616B650A | | côté | 0263C3B474C3A9 | | 1100 | 001100 | +------------------+------------------------+ 

注釈

上記のクエリは TRY_TO_BINARY を使用しているため、形式が認識されなかったり、指定された形式で文字列が解析できなかったりすると、結果は NULL になります。

SUBSTR および 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; 
Copy
+------------------------+------------------+ | C1 | STRING_VALUE | |------------------------+------------------| | 00AB4F3C421B | AB4F3C421B | | 01736E6F77666C616B650A | c25vd2ZsYWtlCg== | | 0263C3B474C3A9 | côté | | 001100 | 1100 | +------------------------+------------------+ 

JavaScript UDF のカスタムデコーディング

BINARY データ型により、任意のデータを保存できます。JavaScript UDFs は Uint8Array を介してデータ型をサポートしているため( JavaScript UDFs の紹介 を参照)、 JavaScriptでカスタムデコードロジックを実装できます。これは最も効率的な作業方法ではありませんが、非常に強力です。

最初のバイトに基づいてデコードする関数を作成します。

CREATE OR REPLACE 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;'; 
Copy
SELECT c1, my_decoder(c1) FROM bin; 
Copy
+----------------+----------------+ | C1 | MY_DECODER(C1) | |----------------+----------------| | 002A | 42 | | 0148656C6C6F21 | "Hello!" | | 00FFFF | 65535 | | 020B1701 | null | +----------------+----------------+