linux下php使用freetds连接windows下的mssql解决方案以及碰到问题

最近公司要上马动网论坛转到discuz,但是要求能在discuz上调用原动网、动易等asp+sql server平台上的数据,能在动网/动易等其他asp或者.net平台调用discuz中的mysql数据。

开始准备使用这些cms/bbs后台中的javascript调用,后来考虑到seo、效率等因素,决定直接调用数据库——或者使用已有接口;或者干脆直接读数据库。

其实从asp调用mysql还是比较简单,问题是我们这里discuz准备使用linux平台(LAMP),所以要从discuz中调用出 windows平台的sql server 2000中的数据是比较难的问题。毕竟linux下无法直接支持mssql,而且由于之前的所有数据库都是使用的gb2312编码(后来发现还有个.net编写的模块使用的是latin1排序),而linux下的freetds只支持utf-8编码。

于是在虚拟机环境下装好RHEL5,配置了LAMP环境,php支持iconv,mbstring,gd,jpeg,png等等扩展,这里鄙视一把 virtualbox ,RHEL在里面怎么也设置不了800以上的分辨率,装了add on光盘也没有用,其中过程另有文说明。

然后就是下载freetds,重新编译php,使其支持mssql,装好后进入freetds的设置文件,注意两点

(1)加入一行配置参数,设置默认的client-charset为utf-8

client charset = utf-8

因为调用的sqlserver数据库有gb2312的排序规则的,也有latin1排序规则的,gb2312可以读出正常的汉字,latin1的汉字读出来是乱码问号,所以这里必须强制设置一个client charset参数,我之前忘记这里,还绕了好大圈子,找了半天linux下odbc的资料(因为odbc可以在读取数据后进行自动转码)。

(2)设置默认的host等

[MS2KSQL]
host = 192.168.1.10
port = 1433
client charset = utf-8
tds version = 8.0

[MS2KSQL] 这里关系到你php语句中mysql_connect(host,user,password)的host参数,我开始就是因为这里没有引起注意卡了好久,保留[MS2KSQL]能用freetds自带的的tsql正常连接,同样的参数换php就不行。

因为我需要连接到192.168.0.10,但php使用mysql_connect(”192.168.0.10″,”sa”,”")老是提示连接不上,后来找到一篇文章在最后一个不起眼处说这里要改成你php中mssql_connnet语句对应的host参数才能连接上,于是改成

[192.168.0.10]
host = 192.168.1.10
port = 1433
client charset = utf-8
tds version = 8.0

好了,现在php里可以正常连接了。

tds version = 8.0这里是你连接的sql server 的版本,2000一般写个8.0就可以了

试试吧,现在不管mssql里数据库是utf-8、gbk还是latin1都可以正常读出数据了,这里都会被freetds转成utf-8,因为我们设置了client charset = utf-8!

Posted By admin

One Response to “linux下php使用freetds连接windows下的mssql解决方案以及碰到问题”

  1. loosky 说道:

    貌似我的直接设置client charset = utf-8是没有效果的。
    必须修改php.ini中的:
    mssql.charset = “GBK”

Leave a Reply