PDO(Zend_Db)+SQL Server(ODBC)でStatement使うと型が無視られてTextになる

どうやらまた地雷を踏んだようだ。

Zend_Db(内部的にはPDO)のプリペアドステートメントを使っていると不可思議な現象に遭遇。SQL Serverから、型が違うと怒られるのだ。

こんな感じ

$query = "SELECT :test, :test2 FROM Table1 as si WHERE Name = :test3";
$stmt = $db->prepare($query);
$stmt->bindValue(":test","Name");
$stmt->bindValue(":test2","Mail");
$stmt->bindValue(":test3","jaco");
$stmt->execute();

こんな感じに書いて表示させようとすると、

The data types varchar and text are incompatible in the equal to operator.

と怒られる。ちなみにNameカラムはVarchar型。textとは比較できないよ、というエラーだけども、そもそも何でtext型になってんねん。

SQL Server Profilerで見てみると

declare @p1 int
set @p1=NULL
exec sp_prepare @p1 output,N’@P1 text,@P2 text,@P3 text’,N’SELECT @P1 as test1, @P2 as test2 FROM tblWebStayInformation as si WHERE CompanyCode = @P3′,1
select @p1

見事にすべてtext。勝手に変なことしないでください・・・。

ここでちょっとSQL文を変えてみると

$query = "SELECT * FROM Table1  WHERE Name = :test AND Sequence = :test2";
$stmt = $db->prepare($query);
$stmt->bindValue(":test","Name");
$stmt->bindValue(":test2","Mail");
$stmt->execute();

declare @p1 int
set @p1=NULL
exec sp_prepare @p1 output,N’@P1 varchar(50),@P2 varchar(50)’,N’SELECT * FROM Table1 WHERE Name = @P1, Mail = @P2′,1
select @p1

あぁ、Varcharになった。
つまり、Select句の中にプレースホルダを入れると、なぜか型が全無視されてTextになってしまうと。

調べてみるとここで報告されてました。
Bug #44643 bound parameters ignore explicit type definitions

今回試したのはPHP5.2.8なんですが、未だに直ってないのね・・・。

Comments:0

Comment Form
Remember personal info

Trackbacks:0

Trackback URL for this entry
http://jaco.dotstyle.net/2009/03/pdozend_dbsql-serverodbc%e3%81%a7statement%e4%bd%bf%e3%81%86%e3%81%a8%e5%9e%8b%e3%81%8c%e7%84%a1%e8%a6%96%e3%82%89%e3%82%8c%e3%81%a6text%e3%81%ab%e3%81%aa%e3%82%8b/trackback/
Listed below are links to weblogs that reference
PDO(Zend_Db)+SQL Server(ODBC)でStatement使うと型が無視られてTextになる from JB_Plus
Search
Feeds
Meta

Return to page top