php mysql int string_mysql查出的 int 型字段都是 string
坑點and埋坑點 - mysql查出的int型字段都是string ?
作者:KK
發表日期:2016.10.12
用mysql擴展從數據庫里查出來的數據,int型字段都是string類型 ?
這導致嚴格的數值運算可能受到影響,轉換成JSON輸出給前端的全是string,JS用加法運算符計算時都成了字符串拼接
因此JS老是要麻煩地先parseInt,更麻煩的是這幾年移動端興起,PHP又要把數據傳給客戶端比如JAVA這些語言進行計算
于是這些語言對變量類型比較敏感,你全是string靠譜嗎……!?
測試確認代碼,自己改改配置跑一下:
$dbName = 'test';
$host = '127.0.0.1';
$port = 3306;
$username = 'root';
$password = '121212';
mysql_connect($host . ':' . $port, $username, $password) || die('連接數據庫失敗:' . mysql_error());
mysql_select_db($dbName) || die('選擇數據庫失敗' . $dbName);
if(!$result = mysql_query('select * from user limit 1')){
die('查詢出錯:' . mysql_error());
}
while($row = mysql_fetch_assoc($result)){
var_dump($row);
}
結果就是這兩個int型的字段傳到php里后變成了string
找了一些資料,據說是mysql擴展只是簡單地讀了數據,沒有做類型轉換的
解決辦法:用PDO ?
在這個時代,如果你依然用mysql擴展的話可能算很落伍了,除非你在維護很舊的程序。從PHP5.5版本官方就開始準備放棄對mysql擴展的支持了
那咱該用PDO擴展才比較能順應時代的潮流,然而只用基本的PDO查詢流程也是會有相同的問題:
$pdo = new PDO('mysql:host=127.0.0.1;dbname=test', 'root', '121212');
$statement = $pdo->query('select * from user limit 1');
$result = $statement->fetchAll(\PDO::FETCH_ASSOC);
var_dump($result);
應該這樣的:
$pdo = new PDO('mysql:host=127.0.0.1;dbname=test', 'root', '121212');
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$pdo->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false); //這個可以不設置,因為通常默認為 false,但強行設置可以加個保障,不信你改成true看看,問題又回來了
$statement = $pdo->query('select * from user limit 1');
$result = $statement->fetchAll(\PDO::FETCH_ASSOC);
var_dump($result);
備注:如果字段是decimal類型,那即使對PDO進行設置,但還是會返回string類型
總結
以上是生活随笔為你收集整理的php mysql int string_mysql查出的 int 型字段都是 string的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 5.6 初始化_MySQL
- 下一篇: linux cmake编译源码,linu