mysql:2947
From: とみたまさひろ <とみたまさひろ <tommy@xxxxxxxxxx>>
Date: Sat, 6 Jan 2001 03:54:46 +0900
Subject: [mysql 02947] 日本語正規表現 UDF
とみたです。
MySQL で日本語の正規表現が使えないことについて、日本語だけでなくて
マルチバイト汎用にできないものかと色々と考えてたんですが、諦めました (^^;
で、次に日本語だけに対応させようと思って、MySQL のソースを眺めてたん
ですが、現在の REGEXP, RLIKE 演算子をパッチ等で日本語対応にするという
のも、やはり諦めました (^^;;
# 正規表現のソースはわけわからん… (--;
で、UDF(ユーザ定義関数)ならなんとかなるかな? ということで、Ruby の
正規表現処理部分をそっくりそのまま流用して UDF を作ってみました。
添付の jregexp.c と config.h と、Ruby 1.6.2 のソース中の regex.c と
regex.h を適当なディレクトリにコピーして、
% gcc -I /usr/local/include/mysql -shared -o jregexp.so jregexp.c regex.c
で作られる jregexp.so を適当な場所(/usr/local/lib/mysql とか)において、
# env LD_LIBRARY_PATH=/usr/local/lib/mysql /etc/rc.d/init.d/mysql start
として MySQL サーバを起動します。その後 mysql -uroot で
mysql> create function jregexp returns integer soname "jregexp.so";
とすれば、サーバに jregexp 関数が組み込まれます。
使い方は
jregexp("文字列", "正規表現" [, オプション])
です。文字列が正規表現に適合すれば 1、しなければ 0 を返します。
オプションは次の数値を論理和で指定します。指定しない場合は 1 です。
1 RE_OPTION_IGNORECASE /* match will be done case insensetively */
2 RE_OPTION_EXTENDED /* perl-style extended pattern available */
4 RE_OPTION_MULTILINE /* newline will be included for . */
8 RE_OPTION_SINGLELINE /* ^ and $ ignore newline */
16 RE_OPTION_LONGEST /* search for longest match, in accord with POSIX regexp */
# それぞれのオプションの意味は良くわかりません (^^;
mysql> select jregexp("あいうえお", "い.え") ==> 1
mysql> select jregexp("ほげえええ", "ほげえ+$") ==> 1
対応しているのは日本語EUCだけです。SJIS で使いたい人は jregexp.c の
MBCTYPE_EUC を MBCTYPE_SJIS に変更すれば使えるかもしれませんが、試して
ません。
Ruby のソースを持っていない人のために、ファイル一式を
http://www.tmtm.org/ja/mysql/jregexp.tar.gz
においておきました。
作っておいてなんですが、私は MySQL で正規表現はほとんど使わないんで、
誰か評価してください (^^;;
問題なければ、ドキュメントを適当に書いて MyNA の Web にでも載せたいと
思います。
---
とみたまさひろ <tommy@xxxxxxxxxx>
日本MySQLユーザ会 http://www.mysql.gr.jp
-> 2947 2001-01-06 03:54 [とみたまさひろ <tomm] 日本語正規表現 UDF @ 2948 2001-01-06 03:59 ┗[とみたまさひろ <tomm]