C言語にて MySQL に画像データを保存する

Mac に MySQL をインストールする
の続きです。

MySQL には 大きなバイナリデータを保存する BLOB型 (Binary Large Object) が用意されている。

mysql: BLOB 型と TEXT 型

wikipedia: バイナリ・ラージ・オブジェクト

しかしMySQL には BLOB 型を扱うための関数は用意されていない。

例えば、 sqlite には sqlite3_bind_blob という関数がある。

qiita: sqlite3のblob操作API

MySQL では整数型や文字列型と同様に SQl文でアクセスする。
C言語では バイナリデータを扱うのは面倒です。
そこでバイナリデータを文字列に変換して扱うことにする。
文字列に変換する方法として BESE64と16進表記(hex string)の2つがある。

wikipedia: Base64

wikipedia: 十六進法

C言語にてバイナリデータを Base64 文字列に変換する

C言語にてバイナリデータを 16進文字列に変換する

下記のようにして、ファイルから画像データを読み込み、 Base64 に変換して MySQL に保存する

size_t img_size;
char* img_data = binary_read( fpath, &img_size );

char* b16_data = base64_encode(img_data, img_size);

char FORMAT[] =
"INSERT INTO tb_image( image ) VALUES ( '%s' )";

snprintf( sql, sql_size , FORMAT, b16_data );

mysql_query(conn, sql);

サンプルコードを Github に公開した
https://github.com/ohwada/MAC_cpp_Samples/tree/master/mysql/image