Golang、NodeJs、PHP连接操作Oracle数据库

57 阅读1分钟

环境搭建

  1. 第一步,下载Oracle便捷开发包:

image.png

Oracle Instant Client ODBC 安装说明 | Oracle 中国

  1. 第二步,把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;

Golang