phalconmigrations 本身不感知字段语义,json 字段兼容性取决于 mysql 版本(需 ≥5.7.8)、正确使用 column::type_json 声明,且默认值仅 mysql 8.0.13+ 支持;text 替代方案会导致数据校验缺失、查询低效及无法建虚拟列索引。

PhalconMigrations 是 Phalcon 框架生态中用于数据库版本管理的迁移工具,它本身不直接感知字段类型语义,而是将迁移定义(如 addColumn)编译为标准 SQL 语句执行。因此,“新增 JSON 字段”的兼容性关键不在 PhalconMigrations 本身,而在于你使用的 MySQL 版本、建表语法写法,以及是否规避了旧版本限制。
MySQL 5.7+ 是硬性前提
JSON 类型自 MySQL 5.7.8 起原生支持。若目标环境低于此版本(如 5.6 或更早),无法使用 JSON 类型,强行执行 ADD COLUMN xxx JSON 会报错。此时只能退回到 TEXT 类型 + 应用层校验,但会丢失所有 JSON 函数能力(如 ->、JSON_SET 等)。
PhalconMigrations 中正确声明 JSON 字段
在迁移类中调用 addColumn 时,需显式指定类型为 Phalcon\Db\Column::TYPE_JSON,并确保平台为 MySQL:
- 正确写法(Phalcon 4/5):
$this->addTable('users')->addColumn('settings', Column::TYPE_JSON, ['notNull' => false]); - 错误写法(会被当作字符串处理):
['type' => 'json']或Column::TYPE_TEXT配合手动注释
PhalconMigrations 会据此生成 ADD COLUMN settings JSON 语句,而非 TEXT。
注意 MySQL 8.0.13+ 才支持 JSON 默认值
若你在迁移中尝试设置默认值(如 ['default' => '{}']),MySQL 5.7 和 8.0.12 及之前版本不支持 JSON 列的 DEFAULT 值(除 NULL 外)。只有 MySQL 8.0.13+ 支持 DEFAULT (JSON_OBJECT()) 这类函数表达式默认值。实践中建议:
- 保持默认为
NULL,由应用逻辑控制初始化 - 或改用触发器/应用层首次写入时补全
避免 TEXT 替代方案带来的陷阱
有些团队为“兼容旧版”而坚持用 TEXT 存 JSON,这会引发三类问题:
- 插入非法 JSON 不报错(比如少个括号),数据污染静默发生
- 无法使用
->、JSON_EXTRACT等高效查询语法,只能靠LIKE或正则,性能差且不可靠 - 无法对 JSON 内部字段建立虚拟列索引(如
ALTER TABLE t ADD COLUMN name VARCHAR(50) AS (json_extract(data, '$.name')))
真正需要兼容的不是数据库版本,而是业务能否接受升级到 MySQL 5.7+ —— 这已是 2026 年的行业基线。











