坑点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相关推荐

  1. mysql 面试题 查出每门课程成绩都不低于80分同学的名字

    方法一: 先按名字分组,再在分组中过滤到成绩小于80的同学的名字 select name from student group by name having name not in ( select ...

  2. mysql变量string_mysql sql语句有变量 time_t变量转换为string

    1.char*变量 如果有两个指针变量不可以 需要一个转换为string string strCall ; strCall.assign(pCallInfo->m_szCallerNo,strl ...

  3. MySQL番外篇:INT、CHAR以及VARCHAR数据类型中M的含义

    MySQL中INT.CHAR以及VARCHAR数据类型中M的含义 在MySQL数据库使用过程中,对于int(M).tinyint(M).char(M).varchar(M)等,这个M值到底代表什么意思 ...

  4. mysql中int(16)_MySQL中int(M)和tinyint(M)数值类型中M值的意义

    在一开始接触MySQL数据库时,对于int(M)及tinyint(M)两者数值类型后面的M值理解是最多能够插入数据库中的值不能大于M: 后来工作后,也是一边学习一边使用,之后的理解是其中的M的意思是插 ...

  5. mysql数据库中的int类型_MySQL中int(M)和tinyint(M)数值类型中M值的意义

    在一开始接触MySQL数据库时,对于int(M)及tinyint(M)两者数值类型后面的M值理解是最多能够插入数据库中的值不能大于M: 后来工作后,也是一边学习一边使用,之后的理解是其中的M的意思是插 ...

  6. mysql int(3)_MySQL中int(11)与int(3)的区别_MySQL

    11.2. 数值类型 MySQL支持所有标准SQL数值数据类型.这些类型包括严格数值数据类型(INTEGER.SMALLINT.DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT.RE ...

  7. mysql int类型为null_MySQL INT类型可以为非零NULL吗?

    您可以将INT列的值设置为NULL.INT列键入可为空的列.语法如下:INSERT INTO yourTableName(yourIntColumnName) values(NULL); 为了理解上述 ...

  8. MySQL中建表时的int(m)中的m代表什么意思?

    在我们使用MySQL数据库管理工具建表时,经常在使用选择整数类型比如int后会选择"长度"这一属性值,如下图: 我们也可以使用下列sql语句在建表: CREATE TABLE `t ...

  9. c语言int转换成float,int怎么转化为float 将 int型变量n转换成float型变量的方法是...

    请问C语言中如何将int转换为float 将 int型变量n转换成float型变量的方法是 A float n B (float )n C float( n) D( float) ( n)不懂小编的人 ...

最新文章

  1. oracle .ctl 是什么文件_Oracle误删dual表怎么办?这里教你怎么恢复
  2. 微软翻译api的使用介绍和注意事项
  3. 图解3种常见的深度学习网络结构:FC、CNN、RNN
  4. tomcat相关实验
  5. 软件测试 -- 入门 4 软件测试原则
  6. java se11.0.1安装_jdk11下载安装及环境变量配置
  7. Win 10 蓝屏,出现DRIVER_POWER_STATE_FAILURE的解决方法
  8. 宅急送BOS系统软硬件设备招标(goldengate)
  9. Win10自动更新后桌面文件不见了怎么办?
  10. 苹果真抠门!iPhone 12不再附送充电器
  11. 【普及组_在线赛】班级聚会(reuntion)
  12. sql server升级打补丁
  13. vue实现微信网页授权登录
  14. 人工神经网络ANN建模基础须知
  15. 加--with-x编译vim时报错 configure: error: could not configure X
  16. 网站服务器宕机,B站服务器宕机惊动上海消防,官微致歉
  17. django从零开始引入bootstrap模板
  18. OpenROAD保姆级安装及常见问题解决
  19. 如何最好的实现数据治理?数据治理的有效手段介绍
  20. 【前端实例代码】Html5+css3创建登录和注册表单~实现新拟态新拟物风格(Neumorphism)网页图标效果~手把手教学~新手必会~超简单 ~

热门文章

  1. CompletableFuture异步调用
  2. Docker常用操作
  3. 关于Topic和Partition
  4. 原本挂起的线程继续执行
  5. AnnotationConfigApplicationContext 通过调用注解Bean 定义读取器
  6. SpringMVC的请求-文件上传-文件上传的原理
  7. 统一返回的json时间格式
  8. flume案例-文件数据采集-运行测试
  9. 权限操作-springSecurity概述及快速入门步骤分析
  10. 寄存器计算软件/寄存器小精灵