Quantcast
Channel: Planet MySQL
Viewing all articles
Browse latest Browse all 1081

MySQLのユーザ定義関数(UDF)のbase64encode / base64decodeを使ってみた

$
0
0

MySQLのユーザ定義関数(UDF)にはもやっとした夢を感じます。
この可能性を探るべく、Base64のエンコード・デコードを題材に触れあってみたいと思います。

動機としては、MySQLのユーザ定義関数(UDF)を作りたいと思い、雰囲気を知りたかったから。
手短なものであれば何でも良かった。今では反省してい・・・(ry

UDFの使いどころ

MySQLのビルドイン関数である abs() や concat()のようなものを独自に追加したいときに便利です。ストアドプロシージャーにも限度があるので、無理そうならUDFという流れですかね。

手法 実行速度 利用言語 開発の手間
Stored Procedures 遅い SQL 小さなものであれば数分
UDF 速い C 数時間
Native Function 速い C 一大プロジェクト

※ Stored Proceduresは十分速いですが、ネイティブに比べると遅いというニュアンスです

利用するコード一式

https://github.com/y-ken/mysql-udf-base64

トラブル無く使えるかと思いきや、参考記事にあったbase64のコードのコンパイルが通りません!
仕方ないので少し手を入れて動くようにしましたので、GitHubに上げておきました。
MySQL-5.6.11で動作は確認していますが、MySQL-5.1やMySQL-5.5でも動くと思います。

利用例

mysql> SELECT base64encode('data,binary,text,...');
+--------------------------------------+
| base64encode('data,binary,text,...') |
+--------------------------------------+
| ZGF0YSxiaW5hcnksdGV4dCwuLi4=         |
+--------------------------------------+
1 row in set (0.01 sec)
mysql> SELECT base64decode('ZGF0YSxiaW5hcnksdGV4dCwuLi4=');
+----------------------------------------------+
| base64decode('ZGF0YSxiaW5hcnksdGV4dCwuLi4=') |
+----------------------------------------------+
| data,binary,text,...                         |
+----------------------------------------------+
1 row in set (0.00 sec)
mysql> CREATE TABLE t1 (body text);
Query OK, 0 rows affected (0.02 sec)

mysql> INSERT INTO t1 (body) VALUES (base64encode('something'));
Query OK, 1 row affected (0.01 sec)

mysql> SELECT body, base64decode(body) from t1;
+--------------+--------------------+
| body         | base64decode(body) |
+--------------+--------------------+
| c29tZXRoaW5n | something          |
+--------------+--------------------+
1 row in set (0.00 sec)

インストール方法

ビルドします

$ git clone https://github.com/y-ken/mysql-udf-base64.git
$ cd mysql-udf-base64
$ gcc -Wall -fPIC -I/usr/local/include -shared base64.c -o base64.so
$ sudo install -m 755 base64.so `mysql_config --plugindir`

登録します

mysql> CREATE FUNCTION base64encode RETURNS STRING SONAME 'base64.so';
mysql> CREATE FUNCTION base64decode RETURNS STRING SONAME 'base64.so';

以上。

参考記事

http://www.codeguru.com/cpp/data/mfc_database/misc/article.php/c12615/MySQL-UDFs.htm http://d.hatena.ne.jp/IT7C/20100831/1283261327


PlanetMySQL Voting: Vote UP / Vote DOWN

Viewing all articles
Browse latest Browse all 1081

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>