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靠谱吗……!?

a4a0074301c9b23721e3b3847c4b9ecb.gif

测试确认代码,自己改改配置跑一下:

$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

c1788d9c55def90bd2b1fdf2ead4860a.png

找了一些资料,据说是mysql扩展只是简单地读了数据,没有做类型转换的

5f0a508046d08607b5325d304eff21cf.gif

解决办法:用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类型

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值