[前][次][番号順一覧][スレッド一覧]

mysql:9146

From: "HIROSE, Masaaki" <"HIROSE, Masaaki" <hirose31@xxxxxxxxxx>>
Date: Wed, 07 Apr 2004 15:35:41 +0900
Subject: [mysql 09146] Re: 正規表現

ひろせといいます

on "[mysql 09134] 正規表現"
   <20040406.145101.67882373.fuji@xxxxxxxxxx>
at Tue, 06 Apr 2004 14:51:01 +0900 (JST)
   Hirofumi Fujiwara <fuji@xxxxxxxxxx> wrote:

>   utf8で使用した場合の正規表現ですが、どうも1文字1バイトとしてしか評
>   価していないと思われる例です。参考のため、like では、1文字をちゃん
>   と認識しているようです。
> 
>   正規表現がちゃんと使えると便利なので、是非きちんと対応して欲しいと思っ
>   ております。

かなりやっつけですが、oniguruma
<http://www.geocities.jp/kosako1/oniguruma/index.html> を使った UDF を
作ってみました。

create table j (s varchar(32));
insert into j values
 ('あいう'),
 ('かきく'),
 ('んあいうん'),
 ('イあ');

なデータに対して、default-character-set = utf8 な mysqld だと

  select s 'regexp  あ.う' from j where s regexp 'あ.う';
  Empty set 

  select s 'mregexp あ.う' from j where mregexp(s,'あ.う');
  あいう
  んあいうん

となり、default-character-set = ujis な mysqld だと上記に加え、

  select s 'regexp  い' from j where s regexp 'い';
  あいう
  んあいうん
  イあ

  select s 'mregexp い' from j where mregexp(s,'い');
  あいう
  んあいうん

となり文字の境界もちゃんと処理してくれます。

一応、

Linux 2.4.25
mysql 4.1.1-alpha-Max-log (default-character-set=utf8)
oniguruma-2.2.1

Linux 2.6.5
mysql 4.0.18-log (default-character-set=ujis)
oniguruma-2.2.6

で動作確認しました。

                                  //

使い方は、添付の mregexp.c を

  gcc -I/usr/include/mysql -DENCODING=ONIG_ENCODING_UTF8 -shared -o mregexp.so mregexp.c -lonig

として mregexp.so を作ります。

コンパイルには oniguruma が必要なので、事前にインストールして、適宜
-I を追加してください。
ENCODING は mysqld の default-character-set に合わせてください。ujisな
ら ONIG_ENCODING_EUC_JP 、sjis なら ONIG_ENCODING_SJIS です。
# SQL発行時にも指定できます。

できた mregexp.so を適当な場所、例えば
/usr/local/lib/mysql/mregexp.so にコピーし、
LD_LIBRARY_PATH=/usr/local/lib/mysql を設定して mysqld_safe を起動しま
す。

例えば、/etc/init.d/mysql で
  /usr/bin/mysqld_safe
となっている個所を
  env LD_LIBRARY_PATH=/usr/irori/lib/mysql /usr/bin/mysqld_safe
に変更します。

mysqld 再起動後、以下の SQL を発行して UDF を定義します。

  CREATE FUNCTION mregexp RETURNS INTEGER SONAME "mregexp.so";

これで mregexp が使えるようになりました。

mregexp の使い方は、

  mregexp("文字列", "正規表現" [, "エンコーディング"])

です。エンコーディングは今のところ以下のものしか指定できません。
  ASCII
  UTF-8
  EUC-JP
  SJIS
省略時はコンパイル時に -DENCODING で指定したエンコーディングになります。

                                  //

かなりやっつけなので使用する際は気をつけてください。そのうちもう少し弄
るかもしれません。

ではでは

-- 
ひろせ
http://www.irori.org/



添付ファイル

[前][次][番号順一覧][スレッド一覧]

      9134 2004-04-06 14:51 [Hirofumi Fujiwara <f] 正規表現                                
      9137 2004-04-06 20:17 ┣[Hirofumi Fujiwara <f]                                       
-> @  9146 2004-04-07 15:35 ┗["HIROSE, Masaaki" <h]                                       
      9149 2004-04-07 19:52  ┣[joe <free-zep@xxxxxx]                                     
      9151 2004-04-08 10:28  ┃┗[MURAKAMI Tomokazu <t]                                   
      9203 2004-04-13 17:09  ┗["HIROSE, Masaaki" <h] mregexp-0.2 (Re:  正規表現)         
   @  9205 2004-04-13 20:23   ┗[Kazuhiro Yoshida <mo]                                   
      9206 2004-04-13 20:34    ┗[Kazuhiro Yoshida <mo]