0

0

mysql为int类型的字段php取出来之后为何变为string类型?

php中文网

php中文网

发布时间:2016-06-06 20:32:13

|

2628人浏览过

|

来源于php中文网

原创

我是使用pdo连接的,然后使用var_dump打印出来后,发现mysql中类型为int的字段打印之后变为string类型,不知道这是怎么回事,有没有办法让php显示mysql字段的实际类型?

回复内容:

我是使用pdo连接的,然后使用var_dump打印出来后,发现mysql中类型为int的字段打印之后变为string类型,不知道这是怎么回事,有没有办法让php显示mysql字段的实际类型?

自己测试了下:
PHP-5.4.39(内置驱动mysqlnd 5.0.10)

创建测试表和插入数据:

create table test(
    c1 int, 
    c2 float, 
    c3 float(10,2), 
    c4 double, 
    c5 double(10,2), 
    c6 decimal(10,2), 
    PRIMARY KEY (c1)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into test values(32.10, 32.10, 32.10, 32.10, 32.10, 32.10);
insert into test values(43.21, 43.21, 43.21, 43.21, 43.21, 43.21);
insert into test values(9876543.21, 9876543.21, 9876543.21, 9876543.21, 9876543.21, 9876543.21);
select * from test;
+---------+---------+------------+------------+------------+------------+
| c1      | c2      | c3         | c4         | c5         | c6         |
+---------+---------+------------+------------+------------+------------+
|      32 |    32.1 |      32.10 |       32.1 |      32.10 |      32.10 |
|      43 |   43.21 |      43.21 |      43.21 |      43.21 |      43.21 |
| 9876543 | 9876540 | 9876543.00 | 9876543.21 | 9876543.21 | 9876543.21 |
+---------+---------+------------+------------+------------+------------+

PDO查询var_dump输出:

 $app['db_pconnect'],
        PDO::ATTR_EMULATE_PREPARES => false, //注意这里
        PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'
    ));
} catch (PDOException $e) {
    echo $e->getMessage();
    exit();
}
$sth = $dbh->query('SELECT * FROM test');
$arr = $sth->fetchAll(PDO::FETCH_ASSOC);
$sth = null;
$dbh = null;
var_dump($arr);
//输出:
array(3) {
  [0]=>
  array(6) {
    ["c1"]=>
    int(32)
    ["c2"]=>
    float(32.099998474121)
    ["c3"]=>
    float(32.099998474121)
    ["c4"]=>
    float(32.1)
    ["c5"]=>
    float(32.1)
    ["c6"]=>
    string(5) "32.10"
  }
  [1]=>
  array(6) {
    ["c1"]=>
    int(43)
    ["c2"]=>
    float(43.209999084473)
    ["c3"]=>
    float(43.209999084473)
    ["c4"]=>
    float(43.21)
    ["c5"]=>
    float(43.21)
    ["c6"]=>
    string(5) "43.21"
  }
  [2]=>
  array(6) {
    ["c1"]=>
    int(9876543)
    ["c2"]=>
    float(9876543)
    ["c3"]=>
    float(9876543)
    ["c4"]=>
    float(9876543.21)
    ["c5"]=>
    float(9876543.21)
    ["c6"]=>
    string(10) "9876543.21"
  }
}
//如果设置 PDO::ATTR_EMULATE_PREPARES => true ,则输出:
array(3) {
  [0]=>
  array(6) {
    ["c1"]=>
    string(2) "32"
    ["c2"]=>
    string(4) "32.1"
    ["c3"]=>
    string(5) "32.10"
    ["c4"]=>
    string(4) "32.1"
    ["c5"]=>
    string(5) "32.10"
    ["c6"]=>
    string(5) "32.10"
  }
  [1]=>
  array(6) {
    ["c1"]=>
    string(2) "43"
    ["c2"]=>
    string(5) "43.21"
    ["c3"]=>
    string(5) "43.21"
    ["c4"]=>
    string(5) "43.21"
    ["c5"]=>
    string(5) "43.21"
    ["c6"]=>
    string(5) "43.21"
  }
  [2]=>
  array(6) {
    ["c1"]=>
    string(7) "9876543"
    ["c2"]=>
    string(7) "9876540"
    ["c3"]=>
    string(10) "9876543.00"
    ["c4"]=>
    string(10) "9876543.21"
    ["c5"]=>
    string(10) "9876543.21"
    ["c6"]=>
    string(10) "9876543.21"
  }
}

可以看到无论PDO::ATTR_EMULATE_PREPARES设为false还是true,
decimal(10,2)的类型都是string,输出的数据是正确的.
不模拟预处理时(false),能保持数据类型,但某些类型,输出的数据跟数据库里的数据不一致,比如上面的float.
MySQLi查询返回的字段类型也都是string.
所以说返回string类型给程序是安全的,之后可以进行类型转换:

settype($foo, "array");
settype($foo, "bool");
settype($foo, "boolean");
settype($foo, "float");
settype($foo, "int");
settype($foo, "integer");
settype($foo, "null");
settype($foo, "object");
settype($foo, "string");

$foo = (array)$foo;
$foo = (b)$foo;      // from PHP 5.2.1
$foo = (binary)$foo; // from PHP 5.2.1
$foo = (bool)$foo;
$foo = (boolean)$foo;
$foo = (double)$foo;
$foo = (float)$foo;
$foo = (int)$foo;
$foo = (integer)$foo;
$foo = (object)$foo;
$foo = (real)$foo;
$foo = (string)$foo;

当你把数据存进数据库的那个刻,所有类型都变成字符串了。

立即学习PHP免费学习笔记(深入)”;

比如MySQL能存数据吗?

久久企业网站后台管理系统1.0
久久企业网站后台管理系统1.0

一、功能简介本软件完全适应大、中、小型网站建设需要,让您用很便宜的虚拟主机空间也可以开通4个独立的网站!久久企业网站后台管理系统各种版本开发基础架构均为php+mysql+div+css+伪静态,迎合搜索引擎排名的喜好。另外值得一提的是本站特色的TAG系统可为您的网站做出无限分类,不用任何设置全站ULR伪静态!本建站系统除了有产品发布、新闻(软文)发布、订单管理系统和留言反馈等一些最基本的功能之外

下载

它必须要你先转成字符串再存,比如:转Json、序列化。

php这种类弱类型语言,有可能是你在遍历结果的时候一不小心变给自动转成了string

查看一下变量的赋值地址

入库之前要intval一下。

相关专题

更多
vlookup函数使用大全
vlookup函数使用大全

本专题整合了vlookup函数相关 教程,阅读专题下面的文章了解更多详细内容。

26

2025.12.30

金山文档相关教程
金山文档相关教程

本专题整合了金山文档相关教程,阅读专题下面的文章了解更多详细操作。

28

2025.12.30

PS反选快捷键
PS反选快捷键

本专题整合了ps反选快捷键介绍,阅读下面的文章找到答案。

25

2025.12.30

表格中一行两行的方法
表格中一行两行的方法

本专题整合了表格中一行两行的相关教程,阅读专题下面的文章了解更多详细内容。

3

2025.12.30

cpu温度过高解决方法大全
cpu温度过高解决方法大全

本专题整合了cpu温度过高相关教程,阅读专题下面的文章了解更多详细内容。

5

2025.12.30

ASCII码介绍
ASCII码介绍

本专题整合了ASCII码相关内容,阅读专题下面的文章了解更多详细内容。

31

2025.12.30

GPS是什么
GPS是什么

本专题整合了GPS相关内容,阅读专题下面的文章了解更多详细内容。

3

2025.12.30

wifi拒绝接入
wifi拒绝接入

本专题整合了wifi拒绝接入相关教程,阅读下面的文章了解更多详细方法。

9

2025.12.30

丰网速运介绍
丰网速运介绍

本专题整合了丰网速运查询入口以及相关内容,阅读专题下面的文章了解更多内容。

3

2025.12.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 8.1万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 6.9万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号