关于php中使用odbc或者pdo连接sqlserver时如果查询条件中存在中文会导致查询失败的问题

这两天,可以说三天,一直在调试一段程序,或者一个功能,就是查询sqlserver2005/2008数据库,这段程序很简单,就是查询条件中包含了中文:


我使用的是thinkphp框架,代码如下:


        $m_id = '大商家';
        $result = D('SqlServer')->table('shopname')->where(array('shopname'=>$m_id))->field('id,shopid,shopname')->order('id desc')->find();


返回的结果,$result为null


如果我将查询条件换成int类型时,则结果正常,例如:


        $shopid='1100';
        $result = D('SqlServer')->table('shopname')->where(array('shopid'=>$shopid))->field('id,shopid,shopname')->order('id desc')->find();  


这时是可以正确查询出结果的。


所以PHP对数据库的连接应该是没有问题的,那么问题可能是出在了中文的编码上,于是我打算把查询的中文进行编码,因为sqlserver默认编码好像是gb2312,所以我这样:


        $m_id = '大商家';
        $m_id = iconv('utf-8','gb2312',$m_id);
        $result = D('SqlServer')->table('shopname')->where(array('shopname'=>$m_id))->field('id,shopid,shopname')->order('id desc')->find();
       

但是结果仍然是null,我甚至尝试将iconv换过来,变成iconv('gb2312',utf-8',$m_id),或者换成gbk:iconv('gbk',utf-8',$m_id),或者最后都用了mb_convert_encoding($m_id, 'utf8', 'utf8, gbk, gb2312')和mb_convert_encoding($m_id, 'gbk', 'utf8, gbk, gb2312');


都不行,然后我最后甚至怀疑整个sql可能都要进行转码,于是我这样了:


        $sql = "select * from shopname where shopname='大商家'";
        $sql = mb_convert_encoding($sql, 'utf8', 'utf8, gbk, gb2312');
        $result = D('SqlServer')->query($sql);


可以看出来为了正确的结果我已经没有原则了,但是,得出的结果还是:null  


到底是哪里出了问题呢????


在同事的提醒下,我想到了可能是odbc或者pdo驱动在源头上就有问题,于是我开始查看我的freetds驱动配置:freetds.conf


于是我去查询,结果如下:


Last login: Thu Aug  7 11:11:17 on ttys001

AndyMacBookPro:~ andy$ sudo find / -name freetds.conf

find: /dev/fd/3: Not a directory

find: /dev/fd/4: Not a directory

/Users/andy/Downloads/freetds-0.91/freetds.conf

/usr/local/Cellar/freetds/0.91/etc/freetds.conf

/usr/local/etc/freetds.conf

/usr/local/freetds/etc/freetds.conf

AndyMacBookPro:~ andy$ 



于是我修改了这个下面这个文件:


AndyMacBookPro:~

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值