hostname 必须填华为云 GaussDB 控制台「基本信息」页显示的内网域名(如 rm-xxxxx.mysql.huaweicloud.com),hostport 设为 3306,不可省略;SSL 需通过 params 配置绝对路径证书,charset 必须为 utf8mb4。

hostname 和 hostport 必须填华为云控制台里显示的内网地址 + 端口,公网地址或默认 127.0.0.1:3306 在生产环境必然连不上。
ThinkPHP 的 config/database.php 中 hostname 填什么?
华为云 GaussDB(for MySQL) 实例在控制台「基本信息」页显示两个地址:
- 内网地址(形如
rm-xxxxx.mysql.huaweicloud.com) - 公网地址(需手动绑定 EIP,且不推荐用于生产)
ThinkPHP 连接时必须用内网地址,前提是你的应用服务器(如 ECS)和 GaussDB 实例部署在同一个 VPC 与子网下。否则连接会超时或被安全组拦截。
hostname 字段就填这个内网域名,不要加协议、端口或路径。hostport 单独设为 3306(MySQL 兼容模式默认端口),不能省略——ThinkPHP 不会自动 fallback 到 3306,缺省会导致连接失败。
立即学习“PHP免费学习笔记(深入)”;
常见错误:
- 把控制台看到的「连接命令示例」里的
mysql -h rm-xxx -P 3306直接当 DSN 拼进hostname→ 错,只取-h后面的部分 - 误填公网 IP 或本地
127.0.0.1→ 应用跑在 ECS 上时,这俩都解析不到 GaussDB - 忘记检查安全组:ECS 出方向 + GaussDB 入方向都要放行
3306端口
SSL 加密连接必须开启吗?
华为云 GaussDB(for MySQL) 强制要求 SSL(尤其在新版实例中)。不启用会报错:SSL connection error 或 Access denied for user(即使账号密码正确)。
ThinkPHP 本身不直接暴露 SSL 参数入口,得靠 PDO 底层传参。在 config/database.php 的配置数组里加:
'params' => [
\PDO::MYSQL_ATTR_SSL_CA' => '/path/to/ca.pem',
\PDO::MYSQL_ATTR_SSL_CERT' => '',
\PDO::MYSQL_ATTR_SSL_KEY' => '',
],其中 ca.pem 是华为云提供的根证书,从控制台「SSL 设置」页下载。路径必须是绝对路径(如 /var/www/certs/ca.pem),相对路径无效。
注意:
-
\PDO::MYSQL_ATTR_SSL_CERT和\PDO::MYSQL_ATTR_SSL_KEY在 GaussDB 默认认证模式下留空即可,填了反而可能触发双向认证失败 - 如果用的是
Db::connect()动态连接,params数组一样要带上,且顺序不能错 - 测试阶段临时关闭 SSL?不行。华为云后台策略已禁用非 SSL 连接,无法通过参数绕过
charset 设成 utf8mb4 还是 utf8?
必须设 utf8mb4。GaussDB(for MySQL) 8.0+ 默认字符集是 utf8mb4_unicode_ci,设成 utf8 会导致:
- 插入 emoji 或四字节 UTF-8 字符时被截断或报错
Incorrect string value -
SHOW CREATE TABLE查看表结构时发现字段实际是utf8mb4,但连接层没对齐,隐式转换引发索引失效
配置项写法:
'charset' => 'utf8mb4', 'prefix' => '',
别信某些旧教程说「utf8 兼容性更好」——那是 MySQL 5.5 时代的遗留说法,GaussDB 不吃这套。
为什么 Db::connect() 有时连得上,Db::table() 却报错?
因为 Db::connect($config) 返回的是独立 Query 实例,而 Db::table('user') 走的是全局默认连接(即 config/database.php 里配的那个)。
典型坑:
- 你用
Db::connect()测试连通性成功了,就以为全局配置没问题 → 实际上全局配置里漏了params或charset - 多个数据库共存时,动态连接用了 A 实例配置,但模型类仍走默认 B 配置 → 查不到表或连错库
解决方法:
- 统一用配置文件管理,除非真有运行时切换需求
- 若必须动态连接,所有涉及数据库操作的代码都得基于该实例调用,例如:
$db->table('user')->select(),不能混用Db::静态门面 - 检查
database.php里'default' => 'mysql'是否匹配你定义的连接名(如有多个)
GaussDB 的 DNS 解析延迟比本地 MySQL 高,首次连接慢是正常的;但持续超时,八成是安全组、VPC 或证书路径错了——这些地方没法靠重试解决,得逐项确认。



















