目录
描述
CI+PHP从sqlserver取回的数据乱码,取回的数据,中文正常,但是中文之间总是会夹杂几个问好,数字、英文正常;
过程
整个过程,折腾了一天,可累死我了。
页面乱码,首先把数据库的查询结果和网页显示的结果对比一下,反反复复对比了好几次,数据库的结果都是没有问题的,数据库没问题,页面有问题,第一反应是这中间传输的时候有问题。
但是还是以为是页面乱码的问题,查询过上百条答案,广大网友的答案出奇的一致,于是我把编码改成utf-8,我在php中添加了一行代码
header("Content-type:text/html;charset=utf-8");
然并卵,页面还是乱码,是不是姿势不对???于是我在页面头部head标签里面又添加了一次
<meta charset="utf-8">
可是,还是没有反应。
是不是utf不对???于是又轰轰烈烈的把网页、php配置文件改成gbk、gb2312,都不好使,乱码反而更严重了;不止数据乱码,整个网页全是问号。艾玛,可气死我了;
又有网友提到,查一下数据库数据的编码,代码如下:
数据库新建查询:
SELECT COLLATIONPROPERTY('Chinese_PRC_Stroke_CI_AI_KS_WS', 'CodePage')
运行后的结果参考以下:
936 简体中文GBK
950 繁体中文BIG5
437 美国/加拿大英语
932 日文
949 韩文
866 俄文
65001 unicode UFT-8
我的显示936,也就是我的数据库是gbk编码,于是,“灵感”来了,又轰轰烈烈的改网页编码,折腾了好一会儿,以失败告终。
我想,既然网页的改变不了,我就改数据库,这是下下策,但是我编程急需一些“正常”的数据,反正我运行的本地数据库,数据库都在本地,没啥大的影响,上线的时候,再处理编码的问题。结果,还是没有成功;
解决办法
天色渐晚,快到下班时间了,回想一整天踩过的坑,又回到最初的问题,数据库没有问题,页面的数据有问题,应该是数据传输中间件的原因。又查了一会儿,终于找到一篇文章,解决了我的问题,方法如下:
CI目录: system/database/drivers/sqlsrv/sqlsrv_driver.php
public function __construct($params)
{
parent::__construct($params);
if ($this->scrollable === NULL)
{
$this->scrollable = defined('SQLSRV_CURSOR_CLIENT_BUFFERED')
// ? SQLSRV_CURSOR_CLIENT_BUFFERED//这句是框架默认的[删除]
? SQLSRV_CURSOR_STATIC//这句是我添加的[添加]
: FALSE;
}
}
修改以后,问题就解决了
当时看到sqlsrv这个单词的时候,我就知道是什么回事了,因为在配置sqlserver数据库的时候,sqlsrv是php的数据库驱动dbdriver,既然取回来的是数据有问题,那肯定跟这个有关;至于问什么要按照上面这个方法这么改?我也不知道,原文作者的回答也很简单干脆:具体原因不明;