1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > mysql为int类型的字段php取出来之后为何变为string类型?

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

时间:2024-06-18 17:25:29

相关推荐

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

后端开发|php教程

php,mysql

后端开发-php教程

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

源码加授权,ubuntu 实时补丁延迟,关闭tomcat报线程错误,电脑爬虫代码,php下载乱码,巫山中小企业seo推广效果lzw

外卖订餐源码,vscode主题网站,ubuntu设置源,tomcat环境变量设置,sqlite接口,官网网页设计方案,dedecms 连接数据库失败,阿里云服务器版本升级吗,jquery移动端插件,常见的前端框架,爬虫 .net,php 方法调用,seo岗位,springboot源数据原理,jquery tab标签,贷款网站模版,网页版学生管理系统,公安织梦模板,dede后台不显示文章,wordpress about页面,thinkphp会员管理系统,平台程序ziplzw

回复内容:

校园o2o源码下载,ubuntu完整新手安装,通过命令创建爬虫,php [] 数组,卫辉seo营销lzw

我是使用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;

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

比如MySQL能存数据吗?

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

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

查看一下变量的赋值地址

入库之前要intval一下。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。