EMATCHES

oninit

2006年11月15日 00:13

昔の INFORMIX ( OnLine とか SE の version 4 とか version 5 の時代です ) には、EMATCHES 、という全角文字と半角文字を同じとみなして検索してくれるキーワードがありました。

Informix SE/IDS のversion 7 以降では、EMATCHES キーワードはなくなってしまいましたが、International Language Supplement には、「EMATCHES互換ロケール」とでも言うような、隠し技的ロケールが含まれています。これを使ってみました。
$INFORMIXDIR/gls/lc11/ja_jp.*emat.lcoというファイルがあれば、EMATCHS互換ロケールはインストール済みです。


( 以下、Windows 版の Informix Dynamic Server version 10.00.TC5 での実験に使った Windows バッチファイルです )

REM 環境変数の設定
set CLIENT_LOCALE=ja_jp.sjis-s
set DB_LOCALE=ja_jp.sjis-s

REM 実験用データベースの作成
echo drop database ematsample; | dbaccess - -
echo create database ematsample with log; | dbaccess - -

REM 実験用表の作成 ( CHAR 型と NCHAR 型の2つの列 )
echo create table tab1 ( col1 char(20), col2 nchar(20) ); | dbaccess ematsample -

REM 実験用表にデータを挿入
echo insert into tab1 values ( "HAL", "HAL" ); | dbaccess ematsample -
echo insert into tab1 values ( "IBM", "IBM" ); | dbaccess ematsample -
echo insert into tab1 values ( "HAL", "HAL" ); | dbaccess ematsample -
echo insert into tab1 values ( "IBM", "IBM" ); | dbaccess ematsample -
echo insert into tab1 values ( "アイ・ビー・エム", "アイ・ビー・エム" ); | dbaccess ematsample -
echo insert into tab1 values ( "ワン・ツー・スリー", "ワン・ツー・スリー" ); | dbaccess ematsample -
echo insert into tab1 values ( "アイ・ビー・エム”, ”アイ・ビー・エム" ); | dbaccess ematsample -
echo insert into tab1 values ( "ワン・ツー・スリー", "ワン・ツー・スリー" ); | dbaccess ematsample -

REM ふつうのロケールで CHAR 型列を基準に並べ替え
echo set collation 'ja_jp.sjis-s';select col1, col2 from tab1 order by col1; | dbaccess ematsample - > result1.txt
REM ふつうのロケールで NCHAR 型列を基準に並べ替え
echo set collation 'ja_jp.sjis-s';select col1, col2 from tab1 order by col2; | dbaccess ematsample - >> result1.txt

REM EMATCHES互換ロケールで CHAR 型列を基準に並べ替え
echo set collation 'ja_jp.sjis-s@emat';select col1, col2 from tab1 order by col1; | dbaccess ematsample - > result2.txt
REM EMATCHES互換ロケールで NCHAR 型列を基準に並べ替え
echo set collation 'ja_jp.sjis-s@emat';select col1, col2 from tab1 order by col2; | dbaccess ematsample - >> result2.txt


result2.txt の内容のうち、col2 (NCHAR型列)を基準に並べ替えた結果を見ると、こんなふうになっています。
col1 col2

HAL HAL
HAL HAL
IBM IBM
IBM IBM
アイ・ビー・エム アイ・ビー・エム
アイ・ビー・エム アイ・ビー・エム
ワン・ツー・スリー ワン・ツー・スリー
ワン・ツー・スリー ワン・ツー・スリー
( result1.txt はここには引用しませんでしたが、CHAR でも NCHAR でも並べ替え結果は同じでした )

全角のHALが、半角のIBMよりも前に来ていたり、半角のアイ・ビー・エムが全角のワン・ツー・スリーより前に来ていたりしているのがわかるでしょうか?普通の照合順序では文字コードの順に並んでいます。( たとえば、全角のHALは、半角のIBMより後ろに来ます。またshift-jis だと、半角カタカナは、全角のカタカナよりコード上は後ろになります)が、SET COLLATION 文でemat 付きロケールを指定してあげると、NCHAR型列の比較に関しては、それが「文字」の順(全角だろうが半角だろうが、「ア」は「ワ」より前!) に並ぶようになります。

但し、全角文字と半角文字の同文字は、まったく同じ重み付けになっているようです。このため、場所によっては全角文字が前に来たり、またある場所ではその逆になったりしています。( 上のアイ・ビー・エムは全角が先に来ているのに、ワン・ツー・スリー・は半角が先にきていますね)

関連記事