codeigniter 不支持标准 dsn 字符串连接数据库,而是采用配置数组方式定义连接参数;从 2.x 到 4.x 均将主机、用户名、密码等拆分为独立键值,dsn 字段仅在 ci3 中作为 pdo 备用选项存在且极少使用。

CodeIgniter 不直接使用标准 DSN(Data Source Name)字符串连接数据库,而是通过配置数组方式定义连接参数。从 CodeIgniter 2.x 到 4.x,均不支持类似 mysql://user:pass@host:port/dbname 这样的传统 DSN 格式。
CI 3.x 和 4.x 都用配置数组,不是 DSN 字符串
CodeIgniter 的数据库配置是 PHP 数组,写在 app/Config/Database.php(CI4)或 application/config/database.php(CI3)中。它把主机、用户名、密码等拆成独立键值,而非拼成一个 DSN 字符串。
- CI3 示例(MySQL):
$db['default'] = array(
'dsn' => '', // 这里留空!CI3 中 dsn 键存在但通常不启用
'hostname' => 'localhost',
'username' => 'root',
'password' => '123456',
'database' => 'myapp',
'dbdriver' => 'mysqli',
'dbprefix' => '',
'pconnect' => FALSE,
'db_debug' => (ENVIRONMENT !== 'production'),
'cache_on' => FALSE,
'cachedir' => '',
'char_set' => 'utf8',
'dbcollat' => 'utf8_general_ci',
'swap_pre' => '',
'encrypt' => FALSE,
'compress' => FALSE,
'stricton' => FALSE,
'failover' => array(),
'save_queries' => TRUE
);
- CI4 示例(更简洁,无 dsn 字段):
public $default = [
'DSN' => '', // CI4 中这个字段可留空或忽略
'hostname' => 'localhost',
'username' => 'root',
'password' => '123456',
'database' => 'myapp',
'DBDriver' => 'MySQLi',
'DBPrefix' => '',
'pConnect' => false,
'DBDebug' => (ENVIRONMENT !== 'production'),
'charset' => 'utf8',
'DBCollat' => 'utf8_general_ci',
'swapPre' => '',
'encrypt' => false,
'compress' => false,
'strictOn' => false,
'failover' => [],
'port' => 3306,
];
CI3 中的 dsn 键只是备用选项,极少使用
CI3 文档提到,若设置了非空 'dsn' 字符串且 'hostname' 为空,框架会尝试用 PDO 方式解析该 DSN。但这要求开启 PDO 扩展,并且只适用于部分驱动(如 pdo),不适用于默认的 mysqli 或 mysql。
- 例如用 PDO + MySQL 时可写:
'dsn' => 'mysql:host=localhost;dbname=myapp;charset=utf8mb4'
- 但必须同时设置:
'dbdriver' => 'pdo',并确保'hostname'留空或注释掉 - 实际项目中几乎不用这种方式,因为失去 CI 原生驱动的查询构建器优化和调试支持
为什么 CodeIgniter 不主推 DSN?
CI 的设计目标是轻量、可控、易调试。把连接参数显式拆开,便于:
- 环境变量注入(如用
$_ENV['DB_HOST']替换硬编码) - 运行时动态切换数据库(比如读写分离、多租户)
- 避免 DSN 解析错误(如密码含特殊字符未正确转义)
- 统一处理字符集、持久连接、SSL 等扩展选项
如果非要拼 DSN 字符串(仅限调试或迁移参考)
你可以手动构造,但 CI 不会自动识别它。常见格式如下(仅作理解,不推荐填入配置):
- MySQL / MariaDB:
mysql:host=localhost;port=3306;dbname=myapp;charset=utf8mb4 - PostgreSQL:
pgsql:host=localhost;port=5432;dbname=myapp;user=postgres;password=123456 - SQLite3:
sqlite:/path/to/database.sqlite
注意:这些字符串需配合 PDO 使用,且不能和 CI 原生驱动混用。填进 CI 配置的 dsn 字段前,务必确认驱动类型和扩展已启用。











