php mysql int string_php从mysql取出int数据,变成了string,PDO,mysql,mysqlnd

php ,mysql数据库返回查询结果集,数据库数据类型int,查询的结果全部为 string,比如对象id

正常:

["id"] => int(1)

突然

["id"] => string(1)

一般问题,不大,但是遇到===计算导致出错

因为项目框架TP5,一开始以为是框架问题,查找了tp5官方文档,发现这个问题,有修复过,默认应该是好的,

后来调试本地环境是好的,本地和服务器代码是一样的,推测应该是环境问题导致

p应用MySQL扩展的话,不能获取数据库中的数据类型,而当用mysqlnd的时候,是可以获取的。

在php7以后,mysql扩展已经摒弃了,建议用mysqli,而mysqli是可以获取数据库中的数据类型的,但是默认并没有开启。需要设置option参数  MYSQLI_OPT_INT_AND_FLOAT_NATIVE 为 true

网上资料 发现 http://blog.csdn.net/as17501/article/details/52129681,

$this->conn = mysqli_connect ( $this->host, $this->root, $this->password , $this->database);

mysqli_options($this->conn,MYSQLI_OPT_INT_AND_FLOAT_NATIVE,true);

php手册相关参数地址:http://php.net/manual/zh/mysqli.options.php

以下为参考资料↓↓↓↓

源地址 http://www.druidcoder.cn/2016/05/10/mysql-driver/

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之前

a2e646271c00d16d0f1416177e0232d9.png

5.3之后

308aba7790af29cc079ee26f9cbe8fe1.png

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

通过mysqli的MYSQLI_OPT_INT_AND_FLOAT_NATIVE参数,例如:

1

2

3

4

5

6

7

$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,例如:

1

2

3

4

5

6

7

$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类型。

从这个博客,得到思路应该是PDO中配置问题,

之后查看本地代码,以上设置,代码里都已经设置过,怀疑是环境中PDO问题

之后

https://stackoverflow.com/questions/17213000/pdo-returns-integer-columns-as-string-in-php5-4

然后发现 本地环境和服务器环境 PDO的扩展 mysql 和 mysqlnd有区别

当然用的mysql,之后,卸载php-mysql扩展换成php-mysqlnd

系统环境

php -i

查看结果,开启mysqlnd

07f25a528b2f02106b02701a26dd078a.png

看pdo支持

5edb9df991533954a1e3d7e47fe8b0a9.png

client API version =>mysqlnd5.0......

ok

再次查询发现,id 变成int类型

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值