mysqlndが有効にならない?

PHP5.5以降から、php-mysqlをyumインストールすると、
php-mysqlnd も一緒にインストールされます。

mysqlndが入っていると、DBからデータを取り出した際に、
int型で定義されているカラムのデータはintとして、
string型で定義されているカラムのデータはstringとして取り出すことができます。

今回、PHP5.6の環境で、mysqlndがインストールされていて、
モジュールが有効になっていることを確認できました。
下記の通り、DBからフェッチした値をvar_dump()したところ、
intで定義しているカラムがstringで出力されてしまいました。

object(stdClass)[25]
  public 'user_id' => string '1' (length=1)
  public 'delete_flag' => string '0' (length=1)
  ...

案件によっては、intで定義しているものはintで出力したい
という場合も

まず確認すること

本当にmysqlnd入ってる?

$ php -m | grep mysqlnd
mysqlnd # 出て来ればOK

本当にmysqlnd有効になってる?

$ php -i | grep mysqlnd
/etc/php.d/20-mysqlnd.ini,
~~~~
mysqlnd => enabled # enabledが出て来ればOK
~~~~

じゃあ何が悪いか

実装です。(キリッ
PDO接続時のオプション ATTR_EMULATE_PREPARES をオフにする必要がありました。

$attrs = array(PDO::ATTR_EMULATE_PREPARES => false);
$pdo = new PDO($dsn, $username, $password, $attrs);

これで先ほどのvar_dump()を出力してみると…

object(stdClass)[25]
  public 'user_id' => int 1
  public 'delete_flag' => int 0
  ...

ちゃんとintになって出力されました。

元記事はこちら

mysqlndモジュールが効かない時のTIPS