zxjoke 发表于 2011-5-24 11:03:44

CI 连接oracle 字符乱码

使用OCI8 连接没有乱码,
$conn=oci_connect("bi","bi.2010","bi","utf8");

config.php设置如下:
$config['charset'] = 'UTF-8';

database.php设置如下:
$db['default']['hostname'] = '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.0.50)(PORT=1521))(CONNECT_DATA=(SID=bi)))';
$db['default']['username'] = 'bi';
$db['default']['password'] = 'bi.2010';
$db['default']['database'] = '';
$db['default']['dbdriver'] = 'oci8';
$db['default']['dbprefix'] = '';
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = '';
$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';
$db['default']['swap_pre'] = '';
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE;

编辑环境 nodapad++
保存为 utf8 无bom方式

请问还有什么地方需要配置

jeongee 发表于 2011-5-24 11:18:01

帮你查了一下,OCI连接方式需要设置环境变量NLS_LANG的,具体你可以搜一下。
另外我看了下CI 的oci8_driver.php
发现
/**
       * Set client character set
       *
       * @access        public
       * @param        string
       * @param        string
       * @return        resource
       */
        function db_set_charset($charset, $collation)
        {
                // @todo - add support if needed
                return TRUE;
        }

这里只是实现了一个接口,直接返回的true,OCI方式可能不支持这样设置编码,还是去设置环境变量吧
PS:pdo连接方式是可以的、。但CI没有写pdo的驱动。

zxjoke 发表于 2011-5-24 12:56:46

这是我nls_lang的设置
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8

和数据库的字符集也一样
select userenv('language') from dual;

zxjoke 发表于 2011-5-24 13:04:53

谢谢,现在这个问题解决了,看来对于oracle OCI方式的确就是设置NLS_LANG

kissgxd 发表于 2012-4-9 18:34:10

nls_lang怎么设置?

alkz 发表于 2012-12-8 17:43:56

恩,不错,可以
页: [1]
查看完整版本: CI 连接oracle 字符乱码