INDEXとPOSITIONの動作は同一ですが、セッション クライアント文字セットがKanjiEBCDICでサーバー文字セットがKANJI1であり、かつ親文字列にマルチバイト文字が含まれる場合は例外です。
これは、同一のデータに対してこれらの2つの関数を実行した結果が異なる唯一の場合です。
次のテーブルを作成するとします。
CREATE TABLE iptest ( column_1 VARCHAR(30) CHARACTER SET Kanji1 column_2 VARCHAR(30) CHARACTER SET Kanji1);
次に、以下の列値セットを挿入します。
column_1 | column_2 |
---|---|
MN<AC> | <C> |
MN<AC>P | <A> |
MN<AB>P | P |
MN<AB>P | <B> |
クライアント セッションの文字セットはKanjiEBCDIC5026_0Iです。ここで、この条件下でINDEXとPOSITIONがどのように異なる結果を戻すかを示す問合わせを実行します。
SELECT column_1, column_2, INDEX(column_1,column_2) FROM iptest;
この問合わせの結果は、以下のようになります。
column_1 column_2 Index(column_1,column_2) ----------- ----------- ------------------------ MN<AC > <C > 6 MN<AC >P <A > 4 MN<AB >P P 9 MN<AB >P <B > 6
同じセッション特性を有効にした上で、INDEXの代わりにPOSITIONを使用して、テーブルに対してセマンティクス上同一の問合わせを実行します。
SELECT column_1, column_2, POSITION(column_2 IN column_1) FROM iptest;
この問合わせの結果は、以下のようになります。
column_1 column_2 Position(column_2 in column_1) ----------- ----------- ------------------------------ MN<AC > <C > 4 MN<AC >P <A > 3 MN<AB >P P 5 MN<AB >P <B > 4
結果が異なることは、以下に示す、この特定のケースにおけるINDEXとPOSITIONの動作方法の相違によって説明がつきます。
- INDEXはシフトアウト文字とシフトイン文字をカウントするが、POSITIONはカウントしない。
- INDEXはバイトをカウントするが、POSITIONは論理文字をカウントする。結果として、例えばAはINDEXでは2バイト(2つの物理文字)としてカウントされますが、POSITIONではただ1つの論理文字としてカウントされます。