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]