您的位置:首页 > 数据库 > MySQL

微擎:mysql数据库中的所有字段打印出来为string类型

2018-01-11 16:56 776 查看
最近碰到一个问题,数据库中的字段用var_dump打印出来后,类型为int的字段或者其他类型的字段打印之后都变为string类型。因为涉及积分变动、余额等,这些字段必须保持为int和浮点型、然后加减。

经过查询发现PHP取出的mysql数据默认都会转换为string,这是PHP语言设计的原因。但是在我本地windows环境下写的测试文件,用var_dump()函数打印出来的字段类型和数据库保持一致。本地打印的是int、float类型的。

引申查找的文章中的一句话“以前一直没注意到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。


如果使用的是旧的libmysql,那没办法,得不到mysql数据的类型,都会被转换为string。而从5.3开始使用mysqlnd驱动,就可得到,但是使用mysql扩展还是会被转换成string。

通过mysqli的MYSQLI_OPT_INT_AND_FLOAT_NATIVE参数,例如:
1234567
<?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
4000
= $result->fetch_array(); var_dump($info);
而通过pdo,例如:
1234567
<?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类型。

参考文章链接:http://www.druidcoder.cn/2016/05/10/mysql-driver/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐