mysql pdo查詢結果 int 變成結果string 解決

php與mysql交互

參考資料:

http://stackoverflow.com/questions/1197005/how-to-get-numeric-types-from-mysql-using-pdo#answer-1197041
http://zhangxugg-163-com.iteye.com/blog/1894990
http://dengxi.blog.51cto.com/4804263/1748965
http://blog.ulf-wendel.de/2008/pdo_mysqlnd-the-new-features-of-pdo_mysql/

以前一直沒注意到php從mysql取出來的數據都是string類型,無論是主鍵int id還是float。因爲php是弱類型的語言,所以其實這也沒多大關係。但是這引申出php所使用的mysql驅動等問題。

首先,php是如何與mysql交互的。PHP通過某種api(其實就是擴展),基於某種驅動或lib庫與mysql server連接通信。

api有三種:mysql,mysqli和pdo。

其中mysql擴展已經不被建議使用,它將在5.5被廢棄,而在php7中被去除。

驅動有兩種:libmysqlclient(MySQL client server library )和mysqlnd(MySQL native driver )。

在5.3之前,默認使用的都是libmysql.從5.3開始mysqlnd已經內置於php源代碼中,並且官方強烈建議使用這個驅動,只要在編譯的時候加上就行了,比如:./configure --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-mysql=mysqlnd。
而從5.4開始,三種api的驅動默認都將爲mysqlnd,所以編譯的時候不需要指定驅動了,比如:./configure --with-mysqli --with-pdo-mysql --with-mysql。

可以用下面兩張圖表示:
5.3之前

5.3.png

5.3之後

5.4.png

更多對mysqlnd的介紹,參考官方手冊http://php.net/manual/zh/book.mysqlnd.php

如果使用的是舊的libmysql,那沒辦法,得不到mysql數據的類型,都會被轉換爲string。而從5.3開始使用mysqlnd驅動,就可得到,但是使用mysql擴展還是會被轉換成string。
通過mysqli的MYSQLI_OPT_INT_AND_FLOAT_NATIVE參數,例如:

<?php
$mysqli = new mysqli('127.0.0.1', 'root', '', 'test');
$query = "select * from test_int";
$mysqli->options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE, 1);
$result = $mysqli->query($query);
$info = $result->fetch_array();
var_dump($info);

而通過pdo,例如:

<?php
$pdo = new PDO('mysql:host=127.0.0.1;dbname=test', 'root', '');
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$pdo->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);
foreach ($pdo->query('select * from test_int') as $row) {
var_dump($row);
}

ATTR_EMULATE_PREPARES默認爲true,需要指定;而ATTR_STRINGIFY_FETCHES默認就爲false。

需要注意的是:decimal類型的數據,即使有了以上的配置,依然還是輸出爲string類型。



但是 筆者 設置兩個參數 之後 查詢結果並沒有變成int   (仍然需要設置這兩個pdo屬性爲false)

下面我們查看解決前後的結果對比:

phpinfo 對比:

修改前:


修改後:


解決方式:

PHP 5.3.0及以上版本已經內置mysqlnd驅動, 所以安裝php時並不需要預先安裝mysql, 你可以在安裝php之後再安裝mysql(這與之前版本的php安裝順序差異較大). mysql


PHP 5.3.0及以上版本已經內置mysqlnd驅動, 所以安裝php時並不需要預先安裝mysql, 你可以在安裝php之後再安裝mysql(這與之前版本的php安裝順序差異較大). 

mysqlnd是php官方專爲php開發的驅動程序, 其在內存管理和性能上都比傳統的libmysql驅動要好,故推薦使用mysqlnd, 不使用傳統的libmysql.

編譯php時指定以下幾個值即可

./configure --prefix=/usr/local/php \
--with-mysql=mysqlnd
--with-mysqli=mysqlnd 
--with-pdo-mysql=mysqlnd  

就是這幾條    就實現了  !!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章