微擎:mysql数据库中的所有字段打印出来为string类型
2018-01-11 16:56
776 查看
最近碰到一个问题,数据库中的字段用var_dump打印出来后,类型为int的字段或者其他类型的字段打印之后都变为string类型。因为涉及积分变动、余额等,这些字段必须保持为int和浮点型、然后加减。
经过查询发现PHP取出的mysql数据默认都会转换为string,这是PHP语言设计的原因。但是在我本地windows环境下写的测试文件,用var_dump()函数打印出来的字段类型和数据库保持一致。本地打印的是int、float类型的。
引申查找的文章中的一句话“以前一直没注意到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 )。
如果使用的是旧的libmysql,那没办法,得不到mysql数据的类型,都会被转换为string。而从5.3开始使用mysqlnd驱动,就可得到,但是使用mysql扩展还是会被转换成string。
通过mysqli的MYSQLI_OPT_INT_AND_FLOAT_NATIVE参数,例如:
而通过pdo,例如:
ATTR_EMULATE_PREPARES默认为true,需要指定;而ATTR_STRINGIFY_FETCHES默认就为false。
需要注意的是:decimal类型的数据,即使有了以上的配置,依然还是输出为string类型。
参考文章链接:http://www.druidcoder.cn/2016/05/10/mysql-driver/
经过查询发现PHP取出的mysql数据默认都会转换为string,这是PHP语言设计的原因。但是在我本地windows环境下写的测试文件,用var_dump()函数打印出来的字段类型和数据库保持一致。本地打印的是int、float类型的。
引申查找的文章中的一句话“以前一直没注意到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。
如果使用的是旧的libmysql,那没办法,得不到mysql数据的类型,都会被转换为string。而从5.3开始使用mysqlnd驱动,就可得到,但是使用mysql扩展还是会被转换成string。
通过mysqli的MYSQLI_OPT_INT_AND_FLOAT_NATIVE参数,例如:
1234567 | <?php $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 4000 = $result->fetch_array(); var_dump($info); |
1234567 | <?php $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);} |
需要注意的是:decimal类型的数据,即使有了以上的配置,依然还是输出为string类型。
参考文章链接:http://www.druidcoder.cn/2016/05/10/mysql-driver/
相关文章推荐
- 写一个方法,参数接收一个String类型的对象,最终可以把这个字符串参数中出现过的每一个字母打印出来 例如: "wwqweqdasdafdsfdsferer" 将来方法接收这个参数后会打印:
- java 操作MySQL数据库的一个例子,包括表字段,类型,编码格式,表的所有值读取
- Mysql数据库中图片字段Blob类型和String类型相互转换
- C#获取MySQL数据库中的所有的表名和字段名及字段的数据类型
- MySQL数据库中字段类型为tinyint,读取出来为true/false的问题
- mysql数据库中sql修改字段类型
- 查询数据库内不同表间相同字段不同类型,不同长度的所有字段
- Oracle查询所有的字段数据类型
- oracle字段的所有类型
- 查询在指定的数据库中所有的表名和每个表的字段名及字段类型
- SQL打印出表中所有字段名,并以逗号分隔
- MySql数据库的列类型(字段类型)
- sql 关于文档的表中所有列、列的类型、列的说明、列字段等查询,表外键的查询
- SQL脚本获取指定SQLServer数据库所有表及视图的字段列表及类型、长度
- 列出SQL SERVER 2000 所有表,字段名,主键,类型,长度,小数位数,允许空,默认值,字段说明
- SQL获取指定数据表所有字段类型和精度脚本
- oracle 获取数据库所有表,和获取表所有字段和类型
- MySql数据库,对varchar类型字段str进行where str=0条件查询时,查询结果是什么
- mysql语句中把string类型字段转datetime类型
- 题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。