Php putenv不起任何作用-oracle数据库

Php putenv不起任何作用-oracle数据库,php,oracle,Php,Oracle,我正在尝试使用putenv在OracleDatabase中更改NLS\u LANG。 当我这样做时,效果很好: $a = putenv("NLS_LANG=AMERICAN_AMERICA.AL32UTF8"); var_dump($a); // bool(true) $ab = getenv("NLS_LANG"); var_dump($ab); // string(25) "AMERICAN_AMERICA.AL32UTF8" 但是,当我连接并查询相同的数据时,会得到不同的结果: $dbS

我正在尝试使用
putenv
OracleDatabase
中更改
NLS\u LANG
。 当我这样做时,效果很好:

$a = putenv("NLS_LANG=AMERICAN_AMERICA.AL32UTF8");
var_dump($a); // bool(true)
$ab = getenv("NLS_LANG");
var_dump($ab); // string(25) "AMERICAN_AMERICA.AL32UTF8"
但是,当我连接并查询相同的数据时,会得到不同的结果:

$dbSetting = '(DESCRIPTION = 
    (ADDRESS = (PROTOCOL = TCP)
    (HOST = SERVER_HOST)(PORT = 15210)) 
    (CONNECT_DATA = (SERVICE_NAME = orcl) 
    (SID = orcl)))';
$conn = oci_connect('dbuser', 'dbuser', $dbSetting, 'AL32UTF8') or die('db not connected');
$stid = oci_parse($conn, "select userenv('language') from dual");
     oci_execute($stid);

while($row = oci_fetch_array($stid,OCI_ASSOC)){
   $arr[] = $row;
}
var_dump($arr);
我得到了这个结果:

array(1) {
  [0]=>
  array(1) {
    ["USERENV('LANGUAGE')"]=>
    string(29) "AMERICAN_AMERICA.WE8ISO8859P1"
  }
}
为什么


请帮我找出我做错了什么?

我想根据问题下面的评论,我可以在这里写下答案:

从DUAL中选择USERENV(“语言”);给出会话的 语言和地域但数据库字符集不是客户端, 因此,返回的值不是客户端的完整NLS_LANG设置

至于为什么“如果一个人改变了env.variable的值,那么它就不可见了”——请检查我上面答案的粗体部分


干杯

因为可以在代码运行之前加载Oracle库或创建连接,所以您永远不应该在代码中设置Oracle环境变量,因为结果是不确定的。

您确定不是说先设置环境变量,然后对照数据库参数检查其值,哪个名称相同?是的,我说的是相同的..首先使用putenv和getenv设置/获取,然后查询相同的..从DUAL中选择USERENV('language');提供会话的u,但数据库字符集不是客户端,因此返回的值不是客户端的完整NLS_LANG设置!。点击这里的链接->确定。我现在明白发生了什么。谢谢你的评论。但我可以问你一件事吗?如果我更改了env变量的值,那么它为什么不工作?这意味着更改的值不会影响客户端会话。那么设置env变量的好处是什么?再次检查我的最后一条评论:从DUAL中选择USERENV('language');给出了会话的u。这对当前会话有效。这就是为什么您可以在同一个会话中选择它,它将返回相同的结果。从另一个会话中选择它将只返回该特定会话的env。变量,而不是为会话设置的变量。现在看清楚了吗?让我知道。如果这个问题解决了,我想我可以写一个答案来回答这个问题。