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。变量,而不是为会话设置的变量。现在看清楚了吗?让我知道。如果这个问题解决了,我想我可以写一个答案来回答这个问题。