问题描述
我有一个连接到 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 启动时,它具有可用的值。