Symfony应用数据库中ULID被错误存储为UUID问题
问题根因
Symfony 5.x版本中Doctrine的ulid类型映射默认采用UUID兼容模式存储:会把ULID值转换为128位二进制/带横杠的xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxxUUID格式落库,而非你预期的26位Crockford编码TTTTTTTTTTRRRRRRRRRRRRRRRR原生ULID字符串。这个默认设计是为了兼容现有UUID字段的存储结构,官方文档未在显眼位置标注该差异。
修复步骤
- 修改Doctrine配置,指定ULID使用原生字符串格式存储
编辑config/packages/doctrine.yaml,在dbal配置块下添加类型覆盖规则:
该配置会告诉Doctrine的ULID类型转换器,不要做UUID格式兼容转换,直接输出26位ULID字符串。doctrine: dbal: types: ulid: class: Symfony\Component\Uid\Doctrine\UlidType options: ulid: true - 重新生成并执行数据库迁移
- 删除之前生成的错误ULID字段迁移文件
- 执行
bin/console make:migration生成新迁移,确认生成的字段类型为CHAR(26)而非之前的BINARY(16)或CHAR(36) - 执行
bin/console doctrine:migrations:migrate更新表结构
- 验证结果
重新运行测试代码写入数据,查询数据库即可看到字段存储的是符合预期的可排序原生ULID值。
异常兼容
如果按上述配置后依然存储为UUID格式,先执行composer update symfony/uid升级组件:5.2.10之前的早期版本存在配置不生效的bug,会强制将ULID转换为UUID格式存储。
内容的提问来源于stack exchange,提问作者IguanaBob
相关产品推荐
相关产品推荐

