日期:2014-05-16  浏览次数:20842 次

linux下安装freetds连接sqlserver2005解决乱码问题

最近做了一个php项目,要连接sqlserver2005,在windows下很方便,就不用在说了,关键是系统最后要部署到linux下,而微软没有针对linux下的sqlserver接口,所以只能安装第三方软件,freetds了,下来我把安装的过程列举出来。

?

1.安装freetds

?

?写道
wget ftp://ftp.ibiblio.org/pub/Linux/ALPHA/freetds/stable/freetds-stable.tgz

tar zxvf freetds-stable.tgz

cd freetds-0.82/

./configure --prefix=/usr/local/freetds --with-tdsver=8.0 --enable-msdblib
make && make install

echo "/usr/local/freetds/lib/" > /etc/ld.so.conf.d/freetds.conf

ln -s /usr/local/freetds/lib/libsybdb.so.5.0.0 /usr/local/freetds/lib/libsybdb.so.4

rm -f /usr/local/freetds/etc/freetds.conf
在freetds.conf中插入以下内容

?写道

?

[global]
# TDS protocol version
; tds version = 4.2

# Whether to write a TDSDUMP file for diagnostic purposes
# (setting this to /tmp is insecure on a multi-user system)
dump file = /tmp/freetds.log
; debug flags = 0xffff

# Command and connection timeouts
; timeout = 10
; connect timeout = 10

# If you get out-of-memory errors, it may mean that your client
# is trying to allocate a huge buffer for a TEXT field.
# Try setting 'text size' to a more reasonable limit
text size = 64512

host = 192.168.7.217
port = 1433
tds version = 8.0
#client charset = UFT-8

?host为sqlserver数据库的IP地址,port为端口号,tds version是freetds的版本号 ?client charset是客户端的编码格式,说是能解决乱码问题,但我最后测试时,这个配置文件根本没有起作用,也没用,删除掉对连接数据库也没有任何影响,不知道是我那没设置对还是怎么回事,反正最后是可以用。

?

?

保存后,就可以测试freetds安装成功了没,可以用以下命令连接数据库测试一下

/home/software/freetds-0.82/src/apps/tsql -S 192.168.7.217 -U sa -P 123456

如果出现>1这样的显示,说明你安装成功了,可以输入sql语句进行操作数据库了。

?

2.重新编译php

?

?写道
cd /data0/software/php-5.2.XX/ext/mssql/
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config --with-mssql=/usr/local/freetds/
make && make install

这样就会在PHP的扩展目录中生成一个mssql.so文件

?

3.配置php.ini

?

在文件中加入 extension = "mssql.so"

?

然后重启PHP就可以,我装的是php-fpm,把以重启php-fpm就可以

/usr/local/php/sbin/php-fpm restart

?

4.测试

这样我们在PHP中通过phpinfo就可以看到mssql已经支持了。

我PHP的代码编码格式是utf-8,然后测试时可以正常连接数据库,但是插入中文是就全是乱码,读出时也是乱码,sqlserver数据库的编码格式是gbk, 最后我改freetds.conf中的client charset 是不起任何作用,反正是乱码,最后索性把freetds.conf删掉也可正常连接,看来这个配置文件不起作用。

最后只好打开php.ini配置文件找到以下代码

?

?写道
; Specify client character set.
; If empty or not set the client charset from freetds.comf is used
; This is only used when compiled with FreeTDS
; mssql.charset = "utf-8"

看看说明就知道,是专门针对性freetds的,如果freetds.comf为空或者没有设置client charset时,可以在这块起用mssql.charset这个设置,最后我只好起用mssql.charset = "GBK", 其实我们可以直接设置成utf-8格式,因为我php代码用的是utf-8编码,这样在插入查询数据库时不用在做转码,因为sqlserver用的是gbk。但是纠结的是我们在windows环境下操作数据时是先转成gbk才插入进去的。为了对代码改动影响小一点,只好改成mssql.charset="GBK",这样总算把问题解决了。

?

5.疑惑

freetds.conf不起作用,删除掉也不影响, ?php.ini中说的是If empty or not set the client charset from freetds.comf is used。 ?文件名是freetds.comf 两个文件名的扩展名不一样,难道要把freetds.conf改成freetds.comf才起作用。因为时间关系,没有做测试,如果大家有谁这样测试的可以告诉我一下。

?

在linux下php.ini中可以改mssql.charset,这样不用在代码中操作sqlserver数据时做编码转换,而在windows系统下,是不是也有这样的功能呢,反正我没有发现,如果有谁知道,可以说说。

?

以下就是我配置linux下连接sqlserver的过程,做个记录,希望大家对不对的地方能补充完整

?

?

?