codeigniter 连接 oracle 需满足三条件:启用 php oci8 扩展、正确安装配置 oracle instant client、database.php 中准确配置 oci8 连接参数;ci 4.2.0 起原生支持该驱动,hostname 必须用服务名格式(如 localhost/xe),char_set 推荐设为 al32utf8,database 字段留空。

CodeIgniter 连接 Oracle 数据库需同时满足三个条件:PHP 环境已启用 oci8 扩展、Oracle Instant Client 正确安装并配置、CodeIgniter 项目中数据库配置项准确指向 Oracle 实例。CI 4.2.0 起原生支持 OCI8 驱动,无需额外插件。
确认 PHP oci8 扩展已启用
在终端执行:
-
php -m | grep oci8—— 应输出oci8 -
php --ri oci8—— 查看扩展版本及 Oracle 客户端路径是否匹配(如Oracle Run-time Client Library Version => 11.2.0.4.0) - 若未启用,需先安装 Oracle Instant Client(basic + devel),再编译或启用
extension=oci8.so(Linux/macOS)或extension=php_oci8.dll(Windows)
配置 database.php 中的 OCI8 连接组
编辑 app/Config/Database.php(CI4)或 application/config/database.php(CI3),添加或修改默认连接组:
-
'dbdriver' => 'oci8'—— 必须明确指定 -
'hostname' => 'localhost/XE'或'hostname' => '192.168.1.100:1521/ORCL'—— 使用 Oracle 的服务名格式(非仅 IP),XE 是 Oracle Express Edition 默认服务名 -
'username' => 'your_schema'、'password' => 'your_password'—— 推荐使用专用 schema 用户,避免用SYSTEM或SYS -
'database' => ''—— OCI8 下此项留空,服务名由hostname指定 -
'char_set' => 'AL32UTF8'—— 强烈建议设为 Oracle 推荐的 UTF-8 字符集,避免乱码 -
'dbcollat' => ''—— OCI8 不使用该参数,保持为空
验证连接与基础查询
在控制器中快速测试:
$db = \Config\Database::connect();<br>if ($db->connID) {<br> echo "OCI8 连接成功";<br>} else {<br> echo "连接失败:" . $db->error()['message'];<br>}
注意:
- OCI8 查询构建器支持基本
SELECT、INSERT、UPDATE,但部分高级语法(如ROWNUM分页)需手动写原生 SQL - 表名和字段名默认转为大写(Oracle 默认行为),若建表时用了双引号定义小写名,查询时也需加引号,例如:
$builder->from('"users"') - CI4.2+ 的查询构造器已支持子查询和 UNION,可安全用于复杂 Oracle 场景
常见报错与应对
遇到连接失败时,优先检查:
-
TNS:could not resolve the connect identifier → hostname 格式错误,确认服务名在
$ORACLE_HOME/network/admin/tnsnames.ora中存在,或改用 Easy Connect 格式(如localhost:1521/XE) -
ORA-12705: Cannot access NLS data files → 设置环境变量
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8(Linux/macOS)或在 PHP 启动前设置 -
Call to undefined function oci_connect() → oci8 扩展未加载,检查
php.ini和扩展路径











