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進数文字
000000A010000Q100000g110000w
000001B010001R100001h110001x
000010C010010S100010i110010y
000011D010011T100011j110011z
000100E010100U100100k1101000
000101F010101V100101l1101011
000110G010110W100110m1101102
000111H010111X100111n1101113
001000I011000Y101000o1110004
001001J011001Z101001p1110015
001010K011010a101010q1110106
001011L011011b101011r1110117
001100M011100c101100s1111008
001101N011101d101101t1111019
001110O011110e101110u111110+

BASE64を使うメリットですが、BASE64変換を行うことで、文字コードが異なるサーバ間でデータ通信をする場合、文字化けを防ぐことができます。

世界的に標準となっているASCIIコード(64進数)で表現できる文字に変換することで、文字化けが発生しないという理屈です。

6ビットを8ビットにするため、データ量が増えてしまうデメリットがありますので、使う際はディスクの空きサイズは要注意です。

次回ですが、BASE64変換の処理速度が気になるので、処理速度検証を行いたいと思います。

以上です。

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

コメント

コメントを残す

*