这两天,可以说三天,一直在调试一段程序,或者一个功能,就是查询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:~