连上阿里云RDS却报错或本地能连线上不能,核心是网络权限、驱动兼容性、字符集和连接超时四点未对齐:需用控制台地址端口、配安全组/VPC、设mysqli驱动、utf8mb4字符集、加大connect_timeout,并按SSL策略启用encrypt。

直接改 application/config/database.php 就能连上阿里云RDS,但多数人卡在「连得上却报错」或「本地能连、线上连不上」——核心问题不是配置写法,而是网络权限、驱动兼容性、字符集和连接超时这四点没对齐。
hostname 和 port 必须填 RDS 控制台显示的外网/内网地址
很多人复制控制台「连接地址」时漏掉端口,或误用默认 3306 而不核对实际端口。阿里云 RDS-MariaDB 实例的端口在「基本信息」页明确标出(常见是 3306,但自定义实例可能为 3307 等);hostname 不能写 localhost 或 127.0.0.1,必须填控制台里「公网地址」或「内网地址」字段的完整值,例如:rm-xxx.mysql.rds.aliyuncs.com。
如果你的应用部署在同地域 ECS 上,优先用「内网地址」——延迟低、不走公网流量、更安全。否则用「公网地址」,但要确认安全组已放行对应 IP 和端口。
- 安全组必须手动添加入方向规则:协议类型
TCP,端口范围填 RDS 实际端口,授权对象填应用服务器的公网 IP 或 IP 段 - 如果用的是 VPC 网络,ECS 和 RDS 必须在同一个 VPC 下,否则内网地址根本解析不通
- 测试连通性最简单方式:在 ECS 上执行
telnet rm-xxx.mysql.rds.aliyuncs.com 3306,通了再配 CI
dbdriver 必须设为 mysqli,不能用 mysql
mysql 驱动在 PHP 7.0+ 已被彻底移除,CodeIgniter 3.x 默认配置里若还留着 'dbdriver' => 'mysql',启动就会报 Call to undefined function mysql_connect()。RDS-MariaDB 本质是 MySQL 协议兼容服务,必须用 mysqli 或 pdo_mysql。
推荐用 mysqli:轻量、CI 原生支持好、无需额外扩展。配置项写死即可:
$db['default']['dbdriver'] = 'mysqli';
注意以下三点:
-
mysqli不支持mysql_pconnect风格的持久连接,'pconnect' => FALSE是安全选择 - 若你用的是 CodeIgniter 4,驱动名改为
mysqli同样有效,但配置结构已变,不要照搬 CI3 的$db数组写法 - 别碰
dsn字段——RDS 地址带特殊字符(如破折号、点),CI 的 DSN 解析器容易出错,老老实实用 hostname/username/password 分离配置
字符集和 collation 必须匹配 RDS 实例的初始化设置
阿里云 RDS 创建时默认字符集是 utf8mb4,但 CI 默认配置是 utf8,会导致中文插入乱码、emoji 存储失败,甚至建表报错 Specified key was too long。
必须同步修改两处:
$db['default']['char_set'] = 'utf8mb4';$db['default']['dbcollat'] = 'utf8mb4_unicode_ci';
改完后,还需确保 RDS 实例参数组里 character_set_server 和 collation_server 也设为对应值(控制台 → 参数设置 → 修改参数组 → 搜索关键词)。否则即使 PHP 层设对了,建表时仍可能继承服务器默认的 utf8。
连接超时和 debug 开关要按环境区分
线上环境连 RDS 延迟比本地高,mysqli 默认连接超时仅几秒,容易触发 Connection timed out。建议显式加大:
- 在
$db['default']数组里加一项:'port' => 3306(显式声明端口,避免 DNS 解析歧义) - 加
'connect_timeout' => 10(单位秒,CI3.1.11+ 支持该参数) -
db_debug在生产环境必须关:'db_debug' => (ENVIRONMENT !== 'production'),否则任何 SQL 错误都会暴露 RDS 地址和表结构
最容易被忽略的一点:阿里云 RDS 默认开启「SSL 连接」强制策略(尤其新创建实例),而 CI 的 mysqli 驱动默认不走 SSL。如果控制台里「SSL 设置」开关是「已启用」且「强制 SSL」为「是」,就必须在配置中加入:
$db['default']['encrypt'] = TRUE;
否则会报错 SSL connection error 或静默失败。


















