环境搭建
- 第一步,下载Oracle便捷开发包:
Oracle Instant Client ODBC 安装说明 | Oracle 中国
- 第二步,把instant-client_21_13目录添加到环境变量。
PHP
使用扩展:pdo_oci
代码:
<?php
echo "PHP默认编码: " . ini_get('default_charset') . "\n";
echo "NLS_LANG: " . getenv('NLS_LANG') . "\n";
echo "终端代码页: ";
system('chcp');
// 测试输出
$testStr = '中文测试 ABC';
echo "\n原始字符串: $testStr\n";
echo "UTF-8转GBK: " . iconv('UTF-8', 'GBK', $testStr) . "\n";
// 在连接数据库前设置此环境变量
// putenv("NLS_LANG=SIMPLIFIED CHINESE_CHINA.AL32UTF8"); // 或 AMERICAN_AMERICA.AL32UTF8
// 强制UTF-8环境
// putenv("NLS_LANG=AMERICAN_AMERICA.AL32UTF8");
// 设置Oracle客户端字符集
// putenv("NLS_LANG=SIMPLIFIED CHINESE_CHINA.AL32UTF8");
putenv("NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK");
// ========== 手工配置的Oracle连接参数 ==========
$oracle_host = '192.168.8.14'; // 数据库服务器IP或主机名
$oracle_port = '1521'; // Oracle监听端口(默认1521)
$oracle_service = 'hhcs'; // Oracle服务名(不是SID)
// (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=oracle.scs.ryerson.ca)(Port=1521))(CONNECT_DATA=(SID=orcl)))
// 完整的Easy Connect DSN格式
$db_dsn = sprintf(
'oci:dbname=//%s:%s/%s',
$oracle_host,
$oracle_port,
$oracle_service
);
$db_user = 'system';
$db_password = 'manager';
// 移除MySQL专用选项,使用Oracle兼容的配置
$options = array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // 异常模式
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, // 关联数组
PDO::ATTR_EMULATE_PREPARES => false, // 使用原生预处理
);
// 连接数据库
try {
$conn = new PDO($db_dsn, $db_user, $db_password, $options);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$conn->exec("ALTER SESSION SET NLS_LANGUAGE='SIMPLIFIED CHINESE'");
$conn->exec("ALTER SESSION SET NLS_TERRITORY='CHINA'");
// 执行SQL语句
$stmt = $conn->query('SELECT * FROM COMM.DEPT_OI_ATTR_DICT');
// 处理结果集
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
// 确保输出UTF-8编码
// echo mb_convert_encoding($row['OI_ATTR_NAME'], 'UTF-8', 'auto') . "<br>\n";
echo iconv('GBK', 'UTF-8//IGNORE', $row['OI_ATTR_NAME']) . "\n";
// echo $row['OI_ATTR_NAME'] . "\n";
}
} catch (PDOException $e) {
echo "Connection failed: " . $e->getMessage();
}
// 关闭连接
$conn = null;