SQLでBASE64変換を行う方法です。
BASE64エンコードとBASE64デコードの両方を紹介します。
BASE64変換はオラクルの標準関数で提供されているので、仕組みを深く知る必要はありませんが、個人的に知っておく必要があったので、最後に理解した範囲で解説を記載しています。
BASE64エンコード
SQLサンプル
SELECT UTL_RAW.CAST_TO_VARCHAR2( UTL_ENCODE.BASE64_ENCODE( UTL_RAW.CAST_TO_RAW('a') ) ) AS BASE64エンコード FROM DUAL ; BASE64エンコード ------------------- YQ==
解説
- 「UTL_ENCODE.BASE64_ENCODE」を使用してBASE64のエンコード(変換)を行える
- 「UTL_ENCODE.BASE64_ENCODE」の引数はRAW型(バイナリ)であるため、「UTL_RAW.CAST_TO_RAW」を使用して対象文字列をRAW型(バイナリ)に変換する
- 「UTL_ENCODE.BASE64_ENCODE」の返却値もRAW型(バイナリ)であるため、「UTL_RAW.CAST_TO_VARCHAR2」を使用して返却値(RAW型)を文字列に変換する
BASE64デコード
SQLサンプル
SELECT UTL_RAW.CAST_TO_VARCHAR2( UTL_ENCODE.BASE64_DECODE( UTL_RAW.CAST_TO_RAW('YQ==') ) ) AS BASE64デコード FROM DUAL ; BASE64デコード ------------------- a
解説
- 「UTL_ENCODE.BASE64_DECODE」を使用してBASE64のデコード(復元)を行える
- 「UTL_ENCODE.BASE64_DECODE」の引数はRAW型(バイナリ)であるため、「UTL_RAW.CAST_TO_RAW」を使用して対象文字列をRAW型(バイナリ)に変換する
- 「UTL_ENCODE.BASE64_DECODE」の返却値もRAW型(バイナリ)であるため、「UTL_RAW.CAST_TO_VARCHAR2」を使用して返却値(RAW型)を文字列に変換する
BASE64エンコードの解説
- 対象文字列「a」の文字コードを2進数に変換⇒01100001
- 6ビットずつに分割⇒011000 01
- 6ビットに不足している部分は0を追加⇒011000 010000
- 変換表より変換⇒YQ※011000がY、010000がQ
- 各文字の先頭に0を2つ付与して1文字8ビットにする⇒00011000がY、00010000がQ
- 4文字単位になるように不足している部分には「=」を追加して4文字にする⇒YQ==
BASE64デコードの解説
- 対象文字列「YQ==」の「=」を削除⇒「YQ」
- 対象文字列「YQ」の文字コードを2進数に変換⇒00011000 00010000
- 各8ビットの先頭2桁は削除する⇒011000 010000
- 8ビットずつに分割⇒01100001 0000
- 8ビットに満たないものは捨てる⇒01100001
- 文字コードを文字に変換⇒「a」
変換表
2進数 | 文字 | 2進数 | 文字 | 2進数 | 文字 | 2進数 | 文字 |
---|---|---|---|---|---|---|---|
000000 | A | 010000 | Q | 100000 | g | 110000 | w |
000001 | B | 010001 | R | 100001 | h | 110001 | x |
000010 | C | 010010 | S | 100010 | i | 110010 | y |
000011 | D | 010011 | T | 100011 | j | 110011 | z |
000100 | E | 010100 | U | 100100 | k | 110100 | 0 |
000101 | F | 010101 | V | 100101 | l | 110101 | 1 |
000110 | G | 010110 | W | 100110 | m | 110110 | 2 |
000111 | H | 010111 | X | 100111 | n | 110111 | 3 |
001000 | I | 011000 | Y | 101000 | o | 111000 | 4 |
001001 | J | 011001 | Z | 101001 | p | 111001 | 5 |
001010 | K | 011010 | a | 101010 | q | 111010 | 6 |
001011 | L | 011011 | b | 101011 | r | 111011 | 7 |
001100 | M | 011100 | c | 101100 | s | 111100 | 8 |
001101 | N | 011101 | d | 101101 | t | 111101 | 9 |
001110 | O | 011110 | e | 101110 | u | 111110 | + |
BASE64を使うメリットですが、BASE64変換を行うことで、文字コードが異なるサーバ間でデータ通信をする場合、文字化けを防ぐことができます。
世界的に標準となっているASCIIコード(64進数)で表現できる文字に変換することで、文字化けが発生しないという理屈です。
6ビットを8ビットにするため、データ量が増えてしまうデメリットがありますので、使う際はディスクの空きサイズは要注意です。
次回ですが、BASE64変換の処理速度が気になるので、処理速度検証を行いたいと思います。
以上です。