SQL

BASE64変換

  • このエントリーをはてなブックマークに追加

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==

解説

  1. 「UTL_ENCODE.BASE64_ENCODE」を使用してBASE64のエンコード(変換)を行える
  2. 「UTL_ENCODE.BASE64_ENCODE」の引数はRAW型(バイナリ)であるため、「UTL_RAW.CAST_TO_RAW」を使用して対象文字列をRAW型(バイナリ)に変換する
  3. 「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

解説

  1. 「UTL_ENCODE.BASE64_DECODE」を使用してBASE64のデコード(復元)を行える
  2. 「UTL_ENCODE.BASE64_DECODE」の引数はRAW型(バイナリ)であるため、「UTL_RAW.CAST_TO_RAW」を使用して対象文字列をRAW型(バイナリ)に変換する
  3. 「UTL_ENCODE.BASE64_DECODE」の返却値もRAW型(バイナリ)であるため、「UTL_RAW.CAST_TO_VARCHAR2」を使用して返却値(RAW型)を文字列に変換する

BASE64エンコードの解説

  1. 対象文字列「a」の文字コードを2進数に変換
    ⇒01100001
  2. 6ビットずつに分割
    ⇒011000 01
  3. 6ビットに不足している部分は0を追加
    ⇒011000 010000
  4. 変換表より変換
    ⇒YQ
    ※011000がY、010000がQ
  5. 各文字の先頭に0を2つ付与して1文字8ビットにする
    ⇒00011000がY、00010000がQ
  6. 4文字単位になるように不足している部分には「=」を追加して4文字にする
    ⇒YQ==

BASE64デコードの解説

  1. 対象文字列「YQ==」の「=」を削除
    ⇒「YQ」
  2. 対象文字列「YQ」の文字コードを2進数に変換
    ⇒00011000 00010000
  3. 各8ビットの先頭2桁は削除する
    ⇒011000 010000
  4. 8ビットずつに分割
    ⇒01100001 0000
  5. 8ビットに満たないものは捨てる
    ⇒01100001
  6. 文字コードを文字に変換
    ⇒「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変換の処理速度が気になるので、処理速度検証を行いたいと思います。

以上です。

  • このエントリーをはてなブックマークに追加

コメントを残す

*