mysql pdo查詢結果 int 變成結果string
php與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之後
如果使用的是舊的libmysql,那沒辦法,得不到mysql資料的型別,都會被轉換為string。而從5.3開始使用mysqlnd驅動,就可得到,但是使用mysql擴充套件還是會被轉換成string。 通過mysqli的MYSQLI_OPT_INT_AND_FLOAT_NATIVE引數,例如:
$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,例如:
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)
下面我們檢視解決前後的結果對比:
- 前者輸出結果是 string 型別
- 後者輸出是 int 型別
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