2014-08-19 14:21:40 7935次浏览 1条回答 0 悬赏 10 金钱

背景:
数据库 -> oracle;
数据库字符集 -> ZH16GBK;
页面字符集全部UTF-8;

情况:
在测试连接oracle数据库读取数据库的过程中,遇到取中文乱码问题。
并且只是存在使用yii配置文件连接数据库时存在乱码。

一、使用原生连接数据库 无乱码

$conn = oci_connect('test', 'test','localhost/test','UTF8');

if (!$conn) {
	$e = oci_error();
	trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);

}

$name = oci_parse($conn, 'select name from ih_custom');
if (!$name) {
	$e = oci_error($conn);
	trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

while ($row = oci_fetch_array($name, OCI_ASSOC+OCI_RETURN_NULLS))
{
	var_dump($row);
}

输出结果:

array (size=1)
  'NAME' => string '系统机构' (length=12)

array (size=1)
  'NAME' => string '系统管理员' (length=15)

array (size=1)
  'NAME' => string 'uu' (length=2)

二、使用YII2框架的\yii\db\Connection()连接数据库 出现乱码,全部????

$connection = new \yii\db\Connection([
		'dsn' => 'oci:dbname=//localhost:1521/test',
		'username' => 'test',
		'password' => 'test',
		'charset' => 'UTF8'
		]);
$connection->open();

$command = $connection->createCommand("select name from ih_custom");
$names = $command->queryAll();
var_dump($names);

输出结果:

array (size=13)
  0 => 
    array (size=1)
      'NAME' => string '????' (length=4)
  1 => 
    array (size=1)
      'NAME' => string '?????' (length=5)
  2 => 
    array (size=1)
      'NAME' => string 'uu' (length=2)

经过我的多次测试,在使用原生连接数据库没问题,只要使用Yii框架的连接数据库方法必出现?????乱码。求高人指点

补充于 2014-08-19 15:30

引用来自 大鹏展翅 的评论

YII连接数据库默认都是用的PDO的扩展,按照文档对$charset的注释,该属性只适用于MySQL, PostgreSQL and CUBRID 数据库,其他的使用数据库的默认字符集。可改为 'dsn' => 'oci:dbname=//localhost:1521/test;charset=utf-8'试试

根据你的建议,报了个错误,说是charset不对,改为utf8即可。

正确dns为:'dsn' => 'oci:dbname=//localhost:1521/test;charset=utf8'。

最后正常显示中文,灰常感谢。

最佳答案

  • 大鹏展翅 发布于 2014-08-19 15:13 举报

    YII连接数据库默认都是用的PDO的扩展,按照文档对$charset的注释,该属性只适用于MySQL, PostgreSQL and CUBRID 数据库,其他的使用数据库的默认字符集。可改为 'dsn' => 'oci:dbname=//localhost:1521/test;charset=utf-8'试试

    没有找到数据。
您需要登录后才可以回答。登录 | 立即注册
小蘿蔔丁
总监

小蘿蔔丁

注册时间:2014-08-19
最后登录:2017-01-20
在线时长:357小时58分
  • 粉丝7
  • 金钱370
  • 威望0
  • 积分3940

热门问题