如何禁用Ruby on Rails中ActiveRecord自动设置SQL事务配置的功能?
解决ActiveRecord重复执行SESSION配置SQL的问题
一、先把这些参数全局配置到MySQL里
你提到的这几个SESSION级参数,完全可以写到MySQL的全局配置文件(my.cnf/my.ini)里,这样所有新连接都会自动继承,不用每次都发SET语句:
1. 字符集与排序规则
打开MySQL配置文件,在[mysqld]区块里添加:
character-set-server=utf8mb4 collation-server=utf8mb4_general_ci
改完记得重启MySQL服务,新创建的库表会默认用这个字符集,已有的老库表如果之前不是utf8mb4,可能需要手动转换。
2. sql_mode配置
先执行SQL查当前全局的sql_mode:SELECT @@GLOBAL.sql_mode;,把查到的原有内容加上你需要的两个规则,写到配置里:
sql_mode=原有默认内容,STRICT_ALL_TABLES,NO_AUTO_VALUE_ON_ZERO
别直接覆盖默认值,不然可能丢失NO_ENGINE_SUBSTITUTION这类默认约束规则。
3. sql_auto_is_null
直接在[mysqld]区块添加:
sql_auto_is_null=0
4. wait_timeout
这个要和interactive_timeout一起设置,否则客户端连接可能会使用交互式超时值:
wait_timeout=2147483 interactive_timeout=2147483
二、让Rails停止自动发送这些SET语句
全局配置完成后,修改config/database.yml,告诉ActiveRecord不用重复执行初始化配置:
# 以生产环境为例 production: adapter: mysql2 database: 你的数据库名 username: 你的用户名 password: 你的密码 host: 数据库地址 # 禁用默认的初始化SQL init_command: "" # 明确指定字符集,避免Rails自动生成SET NAMES语句 encoding: utf8mb4 collation: utf8mb4_general_ci
三、验证与注意事项
- 重启Rails和MySQL后,查看数据库日志或性能监控工具,确认那串SET语句不再出现。如果还有残留,检查是否有其他脚本、第三方gem在偷偷执行这些命令。
- 全局配置会影响所有连接该MySQL的应用,若有其他服务依赖原有配置,需提前确认兼容性。
- 后续升级Rails或mysql2 gem时,留意默认配置是否变化,防止自动执行的语句再次出现。
内容的提问来源于stack exchange,提问作者nagataaaas
相关产品推荐
相关产品推荐

