Estoy obteniendo errores de "Datos de cadena, truncamiento correcto" de PHP usando ODBC y conectándome a una instancia de Microsoft SQL Server 2008R2

Estoy usando PHP 5.3.3 en un cuadro de CentOS 6.2, conectándome a una instancia de Microsoft SQL Server 2008R2. La conexión funciona y puedo recuperar datos, siempre que mis consultas no contengan parámetros. Cuando agrego parámetros, aparece el error "Datos de cadena, truncamiento correcto".

Aquí hay un código de ejemplo:

<?php

$dbh = new PDO("odbc:myDSN", 'myUsername', 'myPassword');

$testCase = 1;
switch ($testCase) {
case 1:
  //  This case fails with this error:
  //    Error 22001: [Microsoft][ODBC Driver 11 for SQL Server]String data, right truncation (SQLExecute[0] at /builddir/build/BUILD/php-5.3.3/ext/pdo_odbc/odbc_stmt.c:254)
  $query = "select * from [myDatabase].[sys].[objects] WHERE (([name]=?))";
  $stmt = $dbh->prepare($query);
  $param1 = 'testtable1';
  $stmt->bindParam(1, $param1, PDO::PARAM_STR);   //  Note:  '1' is correct; it should not be '0'
  break;
case 2:
  //  This case works properly
  $query = "select * from [myDatabase].[sys].[objects] WHERE (([name]='testtable1'))";
  $stmt = $dbh->prepare($query);
  break;
}
$execResult = $stmt->execute();
if ($execResult) {
  print "Success!\n";
} else {
  $errorInfo = $stmt->errorInfo();
  print "Error " . $stmt->errorCode() . ": " . $errorInfo[2] . "\n";
}

$rowCount = 0;
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
  echo "Row " . $rowCount . ":\n";
  foreach ($row as $key => $value) {
    printf("  %-20s  %s\n", $key, $value);
  }
  $rowCount++;
}

Tenga en cuenta que ambos casos de prueba en el código anterior deberían hacer lo mismo. El caso de prueba 1 usa parámetros (como todo el código debería), y el caso de prueba 2 explícitamente coloca el valor relevante en la consulta SQL. Prueba caso 2 funciona. El caso de prueba 1 no lo hace. He intentado reemplazar 'bindParam ()' con 'bindValue ()', pero esto no tiene ningún efecto. También he intentado usar parámetros con nombre (por ejemplo,:name) en lugar de parámetros posicionales, pero esto tampoco tiene efecto. He intentado agregar un argumento de longitud explícita a bindParam () (usandostrlen($param1) como un valor), pero eso da un mensaje de error muy extraño (Incorrect syntax near 'OUTPUT'), y solo puedo asumir que lo estoy haciendo mal. Los parámetros enteros funcionan correctamente. Sólo los parámetros de cadena fallan.

¿Alguna idea de por qué esto no está funcionando?

Por supuesto, es posible que haya un error en el controlador ODBC, o que no sea compatible con mi versión de PHP, o con una serie de problemas similares, pero espero que simplemente esté usando la API de forma incorrecta.

Editar:

Según la sugerencia de Anda Iancu, profundicé en el SQL Server Profiler. Cuando se rastrea, el caso 1 da dos registros casi idénticos, uno de claseSQL:BatchStartingy uno de claseSQL:BatchCompleted, ambos contienen el texto:

set fmtonly on select [name] from [myDatabase].[sys].[objects] where 1=2 set fmtonly off

El caso 2 proporciona dos registros, ambos de la clase "RPC: Completado". El primero contiene el texto:

declare @p1 int
set @p1=1
exec sp_prepexec @p1 output,NULL,N'select * from [myDatabase].[sys].[objects] WHERE (([name]=''testtable1''))'
select @p1

y el segundo contiene el texto:

exec sp_unprepare 1

Actualizar:

En un movimiento desesperado, con la esperanza de que pudiera haber algún tipo de problema al colocar una nueva versión de unixODBC en una versión existente de PHP, compilé PHP desde la fuente. Esto resulta ser más difícil de lo que piensas, en CentOS. Desafortunadamente, esto no tuvo efecto. Los mismos errores en todo.

Respuestas a la pregunta(2)

Su respuesta a la pregunta