MariaDB 10.0配合Symfony 4迁移时JSON类型语法错误的解决办法
解决MariaDB 10.0.x不支持JSON类型导致Doctrine迁移报错的问题
我之前也碰到过类似的老版本数据库兼容坑,结合你的Symfony 4.0.6和PHP 7.1环境,给你几个实用的解决方案:
方案1:改用Doctrine的json_array类型兼容老数据库
Doctrine的json_array类型就是为不支持原生JSON的数据库设计的——它会把PHP数组/对象序列化为JSON字符串,存在数据库的TEXT字段里,PHP层面会自动完成编码解码,完全不用额外写处理逻辑。
修改实体类里的字段注解就行:
// 原来的写法(会生成JSON类型,触发报错) /** * @ORM\Column(type="json") */ private $data; // 修改为json_array类型 /** * @ORM\Column(type="json_array") */ private $data;
改完直接重新运行doctrine:migration:migrate,Doctrine会自动生成TEXT类型的字段,完美适配MariaDB 10.0.x。
方案2:配置Doctrine类型映射(不改动实体代码)
要是不想修改实体类里的json类型注解,可以通过Symfony配置让Doctrine把json类型自动映射成数据库支持的TEXT或LONGTEXT。
在config/packages/doctrine.yaml里添加这段配置:
doctrine: dbal: # 保留你的其他DBAL配置... types: json: Doctrine\DBAL\Types\TextType
这样Doctrine处理json类型字段时,会直接生成TEXT类型的数据库字段,不用改任何实体代码,迁移就能正常跑通。
方案3:自定义JSON兼容类型(更灵活的控制)
如果需要更精细的设置(比如用LONGTEXT避免长度限制,或者自定义序列化逻辑),可以自己写一个Doctrine自定义类型:
- 创建自定义类型类:
// src/Doctrine/Type/JsonTextType.php namespace App\Doctrine\Type; use Doctrine\DBAL\Types\Type; use Doctrine\DBAL\Platforms\AbstractPlatform; class JsonTextType extends Type { const NAME = 'json_text'; public function getSQLDeclaration(array $column, AbstractPlatform $platform) { // 用LONGTEXT存储,避免TEXT的长度限制 return $platform->getLongTextTypeDeclarationSQL($column); } public function convertToPHPValue($value, AbstractPlatform $platform) { if ($value === null || $value === '') { return []; } return json_decode($value, true); } public function convertToDatabaseValue($value, AbstractPlatform $platform) { if ($value === null) { return null; } return json_encode($value); } public function getName() { return self::NAME; } }
- 在Doctrine配置里注册并映射这个类型:
doctrine: dbal: # 保留你的其他DBAL配置... types: json_text: App\Doctrine\Type\JsonTextType mapping_types: json: json_text # 把原生json类型映射到我们的自定义类型
- 实体类里既可以用
type="json"也可以直接用type="json_text",迁移时都会生成LONGTEXT字段。
额外提醒
如果你已经生成了包含JSON类型的迁移文件,得先把迁移文件里的字段类型改成TEXT或LONGTEXT再执行迁移,不然还是会报错。另外,虽然MariaDB 10.0没有原生JSON函数,但用PHP的json_encode/json_decode完全能处理数据,不会影响业务逻辑。
内容的提问来源于stack exchange,提问作者A.Seddighi
相关产品推荐
相关产品推荐

