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

Symfony应用数据库中ULID被错误存储为UUID问题

问题根因

Symfony 5.x版本中Doctrine的ulid类型映射默认采用UUID兼容模式存储:会把ULID值转换为128位二进制/带横杠的xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxxUUID格式落库,而非你预期的26位Crockford编码TTTTTTTTTTRRRRRRRRRRRRRRRR原生ULID字符串。这个默认设计是为了兼容现有UUID字段的存储结构,官方文档未在显眼位置标注该差异。

修复步骤
  1. 修改Doctrine配置,指定ULID使用原生字符串格式存储
    编辑config/packages/doctrine.yaml,在dbal配置块下添加类型覆盖规则:
    doctrine:
        dbal:
            types:
                ulid:
                    class: Symfony\Component\Uid\Doctrine\UlidType
                    options:
                        ulid: true
    
    该配置会告诉Doctrine的ULID类型转换器,不要做UUID格式兼容转换,直接输出26位ULID字符串。
  2. 重新生成并执行数据库迁移
    • 删除之前生成的错误ULID字段迁移文件
    • 执行bin/console make:migration生成新迁移,确认生成的字段类型为CHAR(26)而非之前的BINARY(16)或CHAR(36)
    • 执行bin/console doctrine:migrations:migrate更新表结构
  3. 验证结果
    重新运行测试代码写入数据,查询数据库即可看到字段存储的是符合预期的可排序原生ULID值。
异常兼容

如果按上述配置后依然存储为UUID格式,先执行composer update symfony/uid升级组件:5.2.10之前的早期版本存在配置不生效的bug,会强制将ULID转换为UUID格式存储。

内容的提问来源于stack exchange,提问作者IguanaBob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 22:06:23