Skip to content

踩坑记录

更新: 12/8/2025 字数: 0 字 时长: 0 分钟

2025 年 10 月 17 日

Spring Boot 连接 MySQL 报“密码错误”问题

  • 问题表现:在 application.yml 中配置 MySQL 的用户名密码时,明明密码是正确的,但连接始终提示 Access denied for user 或密码错误。

  • 原因分析:YAML 对数值以 0 开头的内容,可能会自动解析为八进制。例如:

    yaml
    password: 0127

    在解析阶段,0127 可能不再是字符串,而是当作 八进制数 87 处理,从而导致最终连接密码与真实密码不一致。

  • 正确写法与解决方案:如果密码以 0 开头(如:012345),请使用引号包裹以确保按字符串解析:

    yaml
    password: "012345"
  • 建议:

    • 账户、密码等敏感字符串 尽量避免使用数字开头,尤其是 0
    • 遇到以 0、特殊符号、纯数字等形式的字符串字段配置,建议统一加引号,避免解析被歧义为其他类型
  • 为什么会发生?(底层原理)

    • YAML 不是 JSON,它支持类型推断

    • YAML 规范(尤其 1.1)中明确规定数字类型可根据格式推断为:

      格式解释
      123十进制
      0x1A十六进制
      0123八进制
      true/false布尔值
      yes/no布尔值
      on/off布尔值

    因此 0127、0777、00001 等值都可能被 YAML 解析成八进制而非字符串

    虽然 YAML 1.2 已提出不再默认将前导零解析为八进制,但目前 Spring Boot、Jackson、SnakeYAML 等主流库仍遵循 YAML 1.1 行为,因此依然会触发此坑。

贡献者

The avatar of contributor named as LI SIR LI SIR

页面历史