2009年5月15日金曜日

Oracleの文字列比較

Oracleの固定長文字列比較でちょっとはまったのでメモ書き。

通常、固定長の文字列(CHAR型やリテラル)を比較する場合には、長い方に長さを合わせて不足分にスペースを埋めてから比較します。

一方、左辺、右辺のどちらかが可変長の場合には補完は行わずにそのまま比較します。

CREATE TABLE HOGE ( C_CLASS CHAR(4) );

INSERT INTO HOGE(C_CLASS) VALUES ('PC');

SELECT * FROM HOGE C_CLASS = 'PC';

上記のSQLですがそのまま流すとちゃんとレコードを見つけてきます。ところが、これをプリペアードすると途端に見つけてくれなくなる!

最初は PDO のバグか?と思っていたのですがよくよく調べてみるとなんとOracleはプリぺーアドステートメントのパラメーターに与えたリテラルは固定長文字列(CHAR)ではなく可変長文字列(VARCHAR2)として扱うのだそうです@@

右辺が可変長になってしまったので補完が行われず = が偽を返してしまったわけです><;

まったく、Oracleってやつは…