php putenv() 返回不一致的值

问题描述

我有一个连接到 Oracle 数据库PHP,我需要设置 NLS_LANG 变量。在我的 PHP 中,我将其设置为:

putenv("NLS_LANG=American_America.UTF8");
$oracle = $this->load->database('oracle',TRUE);

//do some query after this

但是返回的值不一致。一次回来

array(1) { [0]=> object(stdClass)#17 (1) { ["USERENV('LANG')"]=> string(2) "US" } } //this is correct

几次刷新后它返回

array(1) { [0]=> object(stdClass)#17 (1) { ["USERENV('LANG')"]=> string(2) "GB" } } //this is from my PC language setting

我用来检查 LANG查询是:

SELECT userenv('LANG') FROM DUAL;

有什么办法可以在不改变我的电脑语言的情况下让它工作吗?

我的配置是:

  • PHP 7.4 (XAMPP)
  • OCI8 2.2.0
  • 赢 7
  • CodeIgniter 3.1.11

注意:我也尝试过使用 $_ENV 但结果也不一致。

解决方法

该变量应该在 PHP 启动之前设置。来自OCI8 documentation

在启动 Web 服务器之前,OCI8 通常需要几个 Oracle 环境变量(见下文)来定位库、指向配置文件并设置一些基本属性,例如 Oracle 库使用的字符集。必须在任何 PHP 进程启动之前设置变量。

这是因为在流程开始后设置它们会导致只有专家才能预测的行为。

为了退缩,您可能想使用 AL32UTF8,这是 Oracle 对 UTF 8 的名称。然后,从 oci_connect() 手册页,您可以将字符集作为参数传递 - 建议这样做:>

传递这个参数可以减少连接所用的时间。

除非您需要覆盖国家和地区组件,否则您可以让它们默认。

如果您确实需要设置 NLS_LANG,请在某些 Windows 系统环境设置中执行此操作,以便在 Apache 启动时,它具有可用的值。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...