You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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自定义类型:

  1. 创建自定义类型类:
// 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;
    }
}
  1. 在Doctrine配置里注册并映射这个类型:
doctrine:
    dbal:
        # 保留你的其他DBAL配置...
        types:
            json_text: App\Doctrine\Type\JsonTextType
        mapping_types:
            json: json_text # 把原生json类型映射到我们的自定义类型
  1. 实体类里既可以用type="json"也可以直接用type="json_text",迁移时都会生成LONGTEXT字段。

额外提醒

如果你已经生成了包含JSON类型的迁移文件,得先把迁移文件里的字段类型改成TEXT或LONGTEXT再执行迁移,不然还是会报错。另外,虽然MariaDB 10.0没有原生JSON函数,但用PHP的json_encode/json_decode完全能处理数据,不会影响业务逻辑。

内容的提问来源于stack exchange,提问作者A.Seddighi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:26:00