Php 如何在pdo oracle(oci)中将字符集设置为UTF8

Php 如何在pdo oracle(oci)中将字符集设置为UTF8,php,oracle,pdo,utf-8,Php,Oracle,Pdo,Utf 8,这是我的php代码 $tns = " (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = myservice) ) )"; $conn = new PDO("oci:dbname=" . $tns, 'user

这是我的php代码

$tns = "
 (DESCRIPTION =
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
      )
        (CONNECT_DATA =
          (SERVICE_NAME = myservice)
      )
 )";
$conn = new PDO("oci:dbname=" . $tns, 'user', 'pass');
当我尝试将字符集设置为UTF8时,如下所示:

$conn = new PDO("oci:dbname=" . $tns . ";charset=UTF8", 'user', 'pass');
将获得:
错误:SQLSTATE[HY000]:OCINlsCharSetNameToId:未知字符集名称(/app/software/php-5.6.30/ext/pdo_oci/oci_driver.c:610)pdo为空

我已经将NLS_LANG设置为
AMERICAN_AMERICA.UTF8
,但我的主机需要重新启动,我现在无法执行

那么,当pdo/oci连接到oracle数据库时,我应该怎么做才能将字符集更改为utf8

我想:

  • 修改oracle数据库中的字符集
  • 仅使用pdo,不使用oci\u connect
  • 重新启动主机

  • 我花了4个小时来解决这个问题:

  • 通过命令vim/etc/sysconfig/httpd修改
    /etc/sysconfig/httpd
  • 在此文件末尾添加以下代码

    export LD_LIBRARY_PATH=/app/oracle/orahome/lib
    export ORACLE_HOME=/app/oracle/orahome
    export NLS_LANG=AMERICAN_AMERICA.UTF8 
    
  • 通过命令重新启动apache
    service httpd restart
  • 对于
    pdo
    oracle
    主机
    ,您不必做任何事。 如果您不知道变量的值,只需在命令行中
    echo$ORACLE\u HOME

    顺便说一句


    所有这三个变量都应该在
    /ect/profile
    中设置,最好在这两个文件中设置相同的变量。

    您的Oracle DB是什么版本的?您可能需要使用
    AL32UTF8
    insteadOracle版本为11g<代码>$conn=new-PDO(“oci:dbname=”.$tns.“charset=AL32UTF8”,“user”,“pass”)获得相同的错误。注意,“UTF8”字符集对于UCSE-8编码是一个误称。真正的UTF-8是字符集“AL32UTF8”,但只要使用unicode BMP,它们就完全相同。它也将适用于PDO_OCI。如果您使用php fpm,请注意,PDO_OCI会受到php fpm“buglet”的影响,它会阻止php在初始化PDO_OCI之前读取php fpm配置文件,请参阅我没有使用
    php fpm
    ,无论如何感谢~@ChristopherJonesSame从crontab运行时出现的问题:在我的情况下,解决方案是将环境变量ORACLE_HOME设置为crontab内部或任务指令之前的export。谢谢