PHP 5.6 Web服务如何保持MySQL字段类型避免全返回字符串?
解决PHP 5.6中MySQL查询结果类型被字符串化的问题
嘿,这个问题在PHP 5.6里确实挺常见的——老版本的数据库扩展默认会把所有MySQL返回的字段都转成字符串,哪怕原字段是int、double或者tinyint(1)类型。不过有几个靠谱的办法能帮你保留原生字段类型,我给你逐一说明:
方法1:用mysqli开启原生数值类型返回
如果你用的是mysqli扩展,可以在建立数据库连接时设置MYSQLI_OPT_INT_AND_FLOAT_NATIVE选项,让int和float类型直接以原生数值返回,不用手动转换:
// 初始化mysqli连接 $mysqli = new mysqli('你的主机地址', '用户名', '密码', '数据库名'); // 开启原生数值类型返回选项 $mysqli->options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE, true); // 检查连接是否成功 if ($mysqli->connect_error) { die('连接失败: ' . $mysqli->connect_error); }
这个选项在PHP 5.3.0及以上就支持了,你的5.6版本完全能用。设置后,int和double类型会自动保留原生类型,至于tinyint(1),它会返回0或1的整数,你可以再手动转成布尔值。
方法2:手动给DTO字段做类型转换
如果不想改数据库连接的设置,或者用的是更老的扩展(比如已经废弃的mysql_*),那手动类型转换是最稳妥的方式。在给DTO赋值时,强制转换每个字段的类型:
// 假设从数据库拿到了$row数组 $dto = new MyClassDTO(); $dto->my_int = (int)$row['my_int']; $dto->my_double = (double)$row['my_double']; // tinyint(1)返回的0/1转成布尔值 $dto->my_bool = (bool)$row['my_bool'];
虽然有点繁琐,但兼容性拉满,不管用什么扩展都能生效。
方法3:用PDO关闭字符串化获取
如果你的项目用的是PDO,可以通过设置PDO::ATTR_STRINGIFY_FETCHES属性为false,让PDO不要把数值类型转成字符串:
// 初始化PDO连接 $pdo = new PDO('mysql:host=你的主机地址;dbname=数据库名', '用户名', '密码'); // 关闭结果字符串化,保留原生类型 $pdo->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false); // 最好同时关闭预处理模拟,确保类型处理更准确 $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
这样设置后,int、double会以原生数值返回,tinyint(1)同样返回0或1,再转布尔值就好。
额外提醒
尽量避免使用已经被废弃的mysql_*扩展,不仅类型处理麻烦,还存在安全隐患,换成mysqli或PDO是更好的选择。
内容的提问来源于stack exchange,提问作者Nodoid
相关产品推荐
相关产品推荐

