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

部署老旧Rails项目到AWS时遇MySQL字符集配置错误求助

解决Rails 2.3.18 + MySQL 8.0 db:migrate字符集匹配错误

问题根源

Rails 2.3.x的数据库适配器(mysql/mysql2)对MySQL 8.0的字符集检测逻辑较为严格,会强制要求数据库的character_set_database值与database.yml中配置的encoding完全一致。MySQL 8.0中utf8是utf8mb3的别名,但老版本适配器无法识别这种别名关系,必须要求字面量完全匹配。


具体解决方案

1. 修改生产数据库的字符集

针对生产数据库单独设置字符集,让character_set_database返回utf8:

ALTER DATABASE 你的生产库名称 CHARACTER SET = utf8 COLLATE = utf8_general_ci;

执行后切换到生产库,查询SHOW VARIABLES LIKE 'character_set_database';会返回utf8,与配置文件的编码要求匹配。

2. 同步database.yml配置

确保config/database.yml的生产环境编码配置与数据库一致:

production:
  adapter: mysql2 # 或mysql,取决于你使用的gem
  database: 你的生产库名称
  encoding: utf8
  # 其他主机、用户名等配置...

3. 临时执行migrate的规避方案

如果暂时不想修改数据库配置,可以在执行命令时临时指定会话字符集:

MYSQL_OPTS="--default-character-set=utf8" bundle exec rake RAILS_ENV=production db:migrate

4. 适配数据库gem版本

老版本的mysql/mysql2 gem与MySQL 8.0兼容性差,Rails 2.3.18建议锁定兼容版本:

# Gemfile中添加
gem 'mysql2', '~> 0.3.21'
# 若使用mysql gem则替换为:
# gem 'mysql', '2.8.1'

执行bundle install更新依赖。


补充说明

单独修改排序规则无法解决问题,因为报错核心是character_set_database的字面量与配置编码不匹配,排序规则仅为字符集的附属属性,不影响该变量的值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 22:37:56