zoukankan      html  css  js  c++  java
  • 【Oracle+PHP】php连接oracle设定字符集,避免乱码

    数据库用oracle,当php连接oracle的时候,最好指定字符集。

    查PHP手册,oci_connect的第四个参数为charset,这是关键。

    首先获取oracle的字符集,运行“select * from V$NLS_PARAMETERS;”,变量NLS_CHARACTERSET对应的就是我们需要的字符集,比如我这里就是“ZHS16GBK”。所以,最终的PHP代码为:

    $c1 = oci_connect("scott", "tiger", $db, 'zhs16gbk');

    我本地的PHP文件统一用utf-8,所以,获取的代码还要经过如下编码转换:

    while ($dat = oci_fetch_row($cur)) {
      print_r(iconv('gb2312', 'utf-8', $dat[0]));
    }

    --------------------------------

    2009-6-25 更新以下文字

    --------------------------------

    同事说,Oracle可以按照 客户端指定的字符集 提供数据。也就是说,如果我本地PHP文件用UTF-8,那么,我在oci_connect的时候,直接指定utf-8就行了,连编码转换都省了。

    $c1 = oci_connect("scott", "tiger", $db, 'UTF8'); 

    另外,有个奇怪的问题:前面编码转换的iconv在测试机环境正常,但是传到远程就不能正常解析了,后来换成了mb_convert_encoding就可以了,代码如下:

    $nickname = mb_convert_encoding($dat[0], 'utf-8', 'gbk');

    可能原因在于iconv里面的第二个参数是否加了“//IGNORE”,请参考http://cn2.php.net/manual/en/function.iconv.php。有兴趣的,可以试试,我就不试了

    另外附上自己封装好的一个php查询oracle数据的方法DingSql:

    /**
    * 封装接入oracle 执行sql语句查询
    * @param sql
    * @return false or string or array(array())
    * @author xzz  2018年5月5日上午9:38:54
    */
    function DingSql($sql = ''){
        header("Content-type: text/html; charset=utf-8");
        if(!$sql) return false;
        $conn= oci_connect('name', 'passwd', 'IP:PORT/serverName','zhs16gbk');
        if($conn) {
            $stid = oci_parse($conn, $sql); // 配置SQL语句,准备执行
            if (!$stid) {
                $e = oci_error($conn);
                print htmlentities($e['message']);
                exit;
            }
            $r = oci_execute($stid, OCI_DEFAULT); // 执行SQL。OCI_DEFAULT表示不要自动commit
            if(!$r) {
                $e = oci_error($stid);
                echo htmlentities($e['message']);
                exit;
            }
        
            $kkk = [];
            $i = '-1';
            while($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) {//返回关联数据并创建null
                $i++;
                foreach($row as $key => $item) {
                    $kkk[$i][$key] = iconv("gb2312", "utf-8//TRANSLIT", $item);
                }
            }
            oci_close($conn);
            return $kkk;    //二维关联数组
        }else{
            echo '连接oracle失败!';exit;
        }
    }
  • 相关阅读:
    强化学习的基本迭代方法
    基于文本描述的事务聚类
    学习强化学习之前需要掌握的3种技能
    其它 华硕 ASAU S4100U 系统安装 win10安装 重装系统 Invalid Partition Table 解决
    数据分析 一些基本的知识
    Python 取样式的内容 合并多个文件的样式 自定义样式
    电商 Python 生成补单公司需要的评论格式3
    SpringBlade 本地图片上传 生成缩略图
    SQL Server 字符串截取
    SpringBlade 本地图片上传
  • 原文地址:https://www.cnblogs.com/xuzhengzong/p/8993993.html
Copyright © 2011-2022 走看看