数据库用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;
}
}

【Oracle+PHP】php连接oracle设定字符集,避免乱码的更多相关文章

  1. 在Visual Studio 2017中,.NET(C#)通过Oracle.ManagedDataAccess来连接Oracle数据库

    C#如何通过Oracle.ManagedDataAccess来连接Oracle数据库 1.先创建一个项目,鼠标右击项目中的引用,再点击管理NuGet程序包(也可以先下载dll文件,再选添加引用),在搜 ...

  2. [转]Oracle因安装时未设定字符集导致中文乱码的解决方案

    在CentOS 6.4上安装Oracle 11g没有设定字符集,采用的是操作系统默认字符集:WE8MSWIN1252,将字符集修改为:AL32UTF8. SQL> select userenv( ...

  3. Oracle.ManagedDataAccess.dll 连接Oracle数据库不需要安装客户端

    最开始,连接Oracle 数据是需要安装客户端的,ado.net 后来由于微软未来不再支持 System.Data.OracleClient 这个 Data Provider 的研发,从 .NET 4 ...

  4. C#用Oracle.DataAccess中连接Oracle要注意版本问题!转)

    一般人,不包括全部平时在开发中使用的都是32位的PC机,所以安装的也是Oracle32位的客户端.但是一般服务器都是64位的,安装的也是 64位的Oracle客户端,如果要部署使用Oracle.Dat ...

  5. Oracle Sql Developer 连接oracle

    PL/Sql 初次使用需要配置文件内容,对于我这种Oracle新手来说各种配置有点凌乱,所以果断选择Sql Developer. 选择它是因为初次使用的时候它不用想PL/Sql那样配置文件,而只需要添 ...

  6. C#用Oracle.DataAccess中连接Oracle要注意版本问题!

    客户端Oracle.DataAccess.dll与服务器版本不一致时,如下修改:1.在客户端Web.config中,增加如下配置:<runtime> <assemblyBinding ...

  7. 在C#中,不安装Oracle客户端如何连接Oracle数据库

    本方法优点: 1.程序内集成Oracle客户端,无需用户自行进行配置 本方法缺点: 2.增加程序包的体积(Oracle instant client本身有几十兆大小) 下面说一下如何实现. 0.首先, ...

  8. NHibernate4使用Oracle.ManagedDataAccess.dll连接oracle及配置多个数据库连接

    NHibernate数据库配置参数在hibernate.cfg.xml中 <?xml version="1.0" encoding="utf-8"?> ...

  9. Navicat for Oracle 绿色版 连接 Oracle 12c

    亲测可用,留下文章以备忘记. Navicat for Oracle 绿色版 地址 链接:http://pan.baidu.com/s/1qY5wMok 密码:kw06 解压到一个目录下. 然后还需要O ...

  10. asp.net连接oracle的问题及方法总结

    .net连oracle数据库的两个方法介绍1. 安装oracle客户端,连接oracle 需要在客户端%oracle_client_home%network/admin/配置tnsnames.ora, ...

随机推荐

  1. linux驱动编写(电源管理驱动)

    对于嵌入式设备来说,合适的电源管理,不仅可以延长电池的寿命,而且可以省电,延长设备运行时间,在提高用户体验方面有很大的好处.所以,各个soc厂家在这方面花了很多的功夫.下面,我们可以看看linux是如 ...

  2. 用EntityFramework6完成增删查改和事务【转】

    http://www.cnblogs.com/wujingtao/p/5407821.html 上一节我们已经学习了如何使用EF连接数据库,并简单演示了一下如何使用EF6对数据库进行操作,这一节我来详 ...

  3. MySQL 高可用性—keepalived+mysql双主(有详细步骤和全部配置项解释)

    博主QQ:819594300 博客地址:http://zpf666.blog.51cto.com/ 有什么疑问的朋友可以联系博主,博主会帮你们解答,谢谢支持! 前言:生产环境中一台mysql主机存在单 ...

  4. 项目总结——MVC+MongoDB实现文件上传

    在做项目的时候我们遇到了视频上传的问题.正式开始项目之前做了一个简单的Demo实现在MVC中视频文件的上 传,考虑到将视频放到MongoDB中上传和读取速度慢的问题,这次我们实现的文件上传是存储的路径 ...

  5. Bootstrap风格button

    一直非常喜欢Bootstrap的按钮风格,仿照Bootstrap做了一套按钮.在ie6/7/8/9/10/11.chrome.firefox下能正常使用. ie6/7/8不支持css3的样式.按钮在这 ...

  6. http://blog.csdn.net/u014595019/article/details/52805444

    http://blog.csdn.net/u014595019/article/details/52805444 tensorflow笔记系列: (一) tensorflow笔记:流程,概念和简单代码 ...

  7. (转) Unity3D 使用Texturepacker打包工具制作NGUI(Atlas)图集

    转自:http://www.unitymanual.com/thread-37485-1-1.html 由于NGUI AtlasMaker对打包的优化不好,容易打出很大的图集,很多部分都是浪费的,所有 ...

  8. Pandas Series笔记

    1.指向单元素的,类型为元素的类型 2.指向多个元素的,类型为Series 3.如果用索引切片,索引是非整型的,实际按照索引顺序取值,且包含末端 4.如果指定的索引不存在,则会报错 5.可以根据元素的 ...

  9. FreeType的项目总是报error LNK2019: unresolved external symbol __imp错误

    用vs2013建立了一个c++的项目,然后在根目录放置了freetype.lib,将GitHub上面的include文件夹拷贝到本机,并且在VS中设置了额外包含目录指向这个inluce文件夹,然后将f ...

  10. 定制加载loading 图片

    项目中要使用一个动态加载图片,找了好久都没有合适的最后发现了这个网站,自由定制需要的gif图片,完全免费啊 http://preloaders.net/en/