thinkphp数据库配置中前缀、编码、端口三项易错:前缀需置于连接配置顶层且模型不自动识别;字符集必须用utf8mb4而非utf8;端口须显式配置为hostport(tp6+),不可省略或误用键名。

ThinkPHP 数据库配置里,前缀、编码、端口这三项最容易写错或忽略细节。关键不是“有没有配”,而是“配对没配准”——尤其跨版本(5.x / 6.x / 7.x)时字段名、位置、默认值都不同。
表前缀 prefix:全局生效但模型不认
前缀必须放在数据库连接配置的顶层,不能塞进 params 数组里(TP6+ 已废弃这种写法)。它只对 Db::name('user') 类操作生效;模型类默认不读取这个配置。
- 在
.env中写成:DATABASE_PREFIX=tp_(全大写+下划线,无引号) - 在
config/database.php中对应连接项里加:'prefix' => 'tp_'(小驼峰键名,字符串值) - 若用模型,需手动处理:在模型中重写
getTableName()方法,或直接定义protected $table = 'tp_user';
字符集 charset:必须是 utf8mb4
别再用 utf8 —— MySQL 的 utf8 实际只支持最多 3 字节字符(不支持 emoji 和部分生僻汉字),utf8mb4 才是完整 UTF-8。配置错误会导致中文乱码或插入失败。
-
.env写法:DATABASE_CHARSET=utf8mb4 -
database.php中写法:'charset' => 'utf8mb4' - 同时确保 MySQL 服务端和数据库/表的 collation 也是
utf8mb4_unicode_ci或类似
端口 hostport:默认值不等于可省略
即使用默认 3306,也建议显式写出。有些环境(如 Docker、云数据库)端口非标,漏写会导致连接超时且报错不明确。
-
.env中:DATABASE_PORT=3306(注意键名是DATABASE_PORT,不是DB_PORT) -
database.php中:'hostport' => '3306'(TP6+ 统一用hostport,不是port或DB_PORT) - TP5.x 可用
port,但 TP6/7 必须用hostport,否则被忽略
不复杂但容易忽略
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











