部署老旧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
相关产品推荐
相关产品推荐

