Symfony项目中MySQL CAST与CONVERT转换字段后仍为字符串的问题求助
解决Symfony中MySQL数值字段返回字符串的问题
我之前在Symfony项目里也碰到过一模一样的情况,当时折腾了好久才搞明白——这本质上是PDO驱动的默认配置导致的,和你的SQL转换语句没关系。MySQL确实返回了数值类型,但PDO会默认把所有数据库返回值都转成字符串,哪怕你用CAST或CONVERT也绕不开这个机制。下面给你几个可行的解决方案:
1. 全局修改PDO配置(推荐)
直接在Symfony的Doctrine配置里关闭字符串化获取和模拟预处理,让PDO直接返回原生数值类型。
打开config/packages/doctrine.yaml,给数据库连接添加PDO选项:
doctrine: dbal: default_connection: default connections: default: url: '%env(resolve:DATABASE_URL)%' options: PDO::ATTR_STRINGIFY_FETCHES: false PDO::ATTR_EMULATE_PREPARES: false
注意:ATTR_EMULATE_PREPARES必须设为false,否则即使关闭了STRINGIFY_FETCHES,PDO还是会把数值转成字符串。
2. 实体类层面指定字段类型
如果你用的是Doctrine ORM,确保你的Article实体里这两个字段的类型设置为float:
// src/Entity/Article.php namespace App\Entity; use Doctrine\ORM\Mapping as ORM; class Article { // ...其他字段 /** * @ORM\Column(type="float") */ private $quantity; /** * @ORM\Column(type="float") */ private $price; // ...对应的getter和setter }
这样Doctrine在映射实体时,会自动把数据库的double类型转换成PHP的float类型,你获取实体后直接调用getter拿到的就是数值,不是字符串。
3. 查询后手动转换(临时方案)
如果不想改全局配置或实体映射,可以在查询结果返回后手动遍历转换类型:
// 假设你用原生SQL查询 $connection = $entityManager->getConnection(); $stmt = $connection->executeQuery('SELECT quantity, price FROM articles'); $lines = $stmt->fetchAllAssociative(); // 遍历转换 foreach ($lines as &$row) { $row['quantity'] = (float)$row['quantity']; $row['price'] = (float)$row['price']; }
或者用ORM查询的话,操作实体对象:
$articles = $entityManager->getRepository(Article::class)->findAll(); foreach ($articles as $article) { $article->setQuantity((float)$article->getQuantity()); $article->setPrice((float)$article->getPrice()); }
为什么CAST/CONVERT没用?
你用CAST(quantity AS SIGNED)确实会让MySQL返回整数类型,但PDO的默认配置会把所有数据库返回值都转成字符串,所以无论你在SQL里怎么转,到PHP层面还是字符串。解决这个问题的核心是调整PDO的行为,而不是SQL语句。
内容的提问来源于stack exchange,提问作者Mlgarate
相关产品推荐
相关产品推荐

