たきるブログ

C#やOracleなどの情報を書いています。

【Oracle】全角%や全角_がLIKE検索で特殊文字として動作しない理由

発覚した経緯

開発環境ではLIKEでの全角%(パーセント)、全角_(アンダーバー)は、Oracleでは特殊文字として利用されているが、本番環境で試すと文字として扱われ、検索結果に違いが発生していた。

LIKEで全角%、全角_は特殊文字で動作する?

色んなサイトを巡っても、LIKEでの全角%(パーセント)、全角_(アンダーバー)は、Oracleでは特殊文字として利用するよーって説明ばかりだった。
[Oracle] LIKE 検索では全角の'%'、'_'も特殊文字として扱われる? | Archive Redo Blog Oracle 11gのLike検索における特殊文字%と_の違い - 小さい頃はエラ呼吸

全角%(パーセント)、全角_(アンダーバー)がLIKE検索で特殊文字として動作しないで、なんで?どして?でサーバーを提供してるメーカーに問い合わせて初めて知った。

結論

  • Oracle のバージョンが11.2.0.3 未満の場合は特殊文字として動作する。
  • Oracle のバージョンが11.2.0.3 以上の場合は特殊文字として動作しない。

動作するというのは、元々不具合の位置づけらしい。
よって、11.2.0.3未満の場合は、『自社の開発環境で動いているからOK』なんて楽観的に考えてはいけないようだ。
本番環境が11.2.0.3以上ならば、それは『動かない』ことになる。
(というか、そもそも開発環境は本番環境に合わせろよと常々思うところ)

面倒な最悪パターン

環境の変更やバージョンアップした時に、既存動作を踏襲しろという話になって困った自分たち。
LIKE検索しているあらゆる機能で、入力された全角%、全角_を半角%、半角_に変換するプログラムを噛ませる羽目になる。

回避方法

11.2.0.3未満でも、全角%、全角_を特殊文字として扱わない方法論で考えてみる。 11.2.0.3未満だとどうしても動作してしまうため、部分検索する入力項目があった時、Oracleのバージョンが11.2.0.3未満の場合は、その入力値に全角%、全角_が入力された時の回避方法は、エスケープすればできそう?
LIKE句を生成する時に、入力値から全角%、全角_を探して全部エスケープしないといけないから原始的だなぁ~って感じもするけど、この情報を知っているなら当然の処置として要検討部分ではなかろうかな。

SELECT
    *
FROM
    EMPLOYEES
WHERE 
    JOB_NAME LIKE '%JOB\%%' ESCAPE '\'

先に記したURLのページにあるように、TO_NCHAR()やLIKECの方法を取ろうとすると、Oracle環境によって動いたり動かなかったりするようなので、プログラムで素直にOracleバージョンを見て、11.2.0.3未満か、以上かで作り上げるLIKE句を切り替える方が良さそうかも。