众所周知,php是弱类型语言,一般情况下我们根本不关心变量是数字类型还是字符串类型,但是在某些时刻确必须要关注。当我们的api被java等强制类型的语言使用时就会出现类型不匹配的问题。这个时候对方肯定强制要求我们api返回的数据必须跟文档上所要求的一样。当然,我们也必须这样要求自己。
前段时间在了解到了这样的问题,结合自己的项目了解了下。其实从数据取出来的时候,数值类型就变成了文本,如果我在数组组装输出的时候做类型的变更,这样也是可以的,但是这样几乎所有的api或者字段要做修改,改动就非常大了,而且感觉也不太科学,凭啥我是数值,你不经允许就给我弄成字符串啦。哈哈。
于是从网上各种找资料看文档,分析得到,php是通过某种api(扩展)基于某种驱动与mysql连接通信的。其中api有三种:mysql、mysqli、pdo,驱动有两种:libmysqlclient(MySQL client server library )和mysqlnd(MySQL native driver )。
api中mysql扩展已经不被建议使用,它在5.5被废弃,而在php7中被去除。而且mysql不支持获取数值类型的数据,取出的都是字符串。mysqli和pdo中只需要做特殊的设置,即可取出数值类型。设置如下:
$mysqli->options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE,1);
$pdo->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
驱动程序中libmysql是不支持获取到数值类型的,只有mysqlnd支持,驱动程序在5.3之前默认使用的是libmysql,从5.3开始mysqlnd已经内置于php源代码中,我们需要在编译的时候加上,5.3之后所有的三种api的驱动都默认为mysqlnd,我们不需要做特殊处理。
所以当我们遇到数据库查出的数值类型是字符串的时候,我们可以一步步的来确定,首先判断api是不是使用的pdo或者mysqli,然后判断相应的属性是否已经设置,然后看我们的驱动是否使用的mysqlnd。