公司业务需要在PHP中调用MSSQL的数据,本来是使用WIN服务器的,后来因为架构需要换成CENTOS,所以没办法只能搞搞支持环境了。
安装 FreeTDS
FreeTDS 是 Linux/Unix 下一组软件开发包,用于实现微软 SQL Server 和 Sybase 的 Tabular DataStream protocol 协议。利用 FreeTDS 可在 Linux/Unix 下连接 SQL Server 和 Sybase 数据库。
可前往FreeTDS官网看详细介绍。
下载并安装 FreeTDS
进入Linux服务器,通过如下命令直接下载到服务器进行安装,以 freetds-0.95.92.tar.gz 为例。
# 下载 freetds,可下载最新 ftp://ftp.freetds.org/pub/freetds/stable/freetds-patched.tar.gz $ wget ftp://ftp.freetds.org/pub/freetds/stable/freetds-0.95.92.tar.gz # 解压 $ tar -zxvf freetds-0.95.92.tar.gz # 进入解压后的目录,注意版本号 $ cd freetds-0.95.92 # 查看当前支持的 tdsver 版本,选择对应支持的 MSSQL 版本 $ ./configure --help # 重编译安装,注意 tdsver 版本 $ ./configure --prefix=/usr/local/freetds --enable-msdblib --with-tdsver=7.3 $ make && make install
整理注释
针对上述命令行中一些简单注释:
--prefix=/usr/local/freetds FreeTDS的默认安装目录 /usr/local/freetds --enable-msdblib 允许 Microsoft 的函数库 --with-tdsver=7.3 指定TDS的协议版本,不填写则默认5.0版,7.3支持MSSQL2008。
TDS协议版本
先看官方文档 http://www.freetds.org/userguide/choosingtdsprotocol.htm
Microsoft SQL Server 2000 7.1 Include support for bigint (64 bit integers), variant and collation on all fields. Collation is not widely used. Microsoft SQL Server 2005 7.2 Includes support for varchar(max), varbinary(max), xml datatypes and MARS[a]. Microsoft SQL Server 2008 7.3 Includes support for time, date, datetime2, datetimeoffset. N/A 8.0 FreeTDS will alias this version to 7.1 for backwards compatibility reasons, but this should be avoided due to future compatibility concerns. See note below on obsolete versions.
上述安装命令中有一行如下命令,目的是用于查看当前安装的FreeTDS支持的协议版本表:
$ cd freetds-0.95.92 $ ./configure --help
运行结果如下:
--with-tdsver=VERSION TDS protocol version (4.2/4.6/5.0/7.0/7.1/7.2/7.3) [5.0]
配置 freetds.conf 文件
运行如下命令:
$ vi /usr/local/freetds/etc/freetds.conf # 针对 MSSQL 修改配置 # A typical Microsoft server [mssql_test] # 这是MSSQL服务器IP/端口号 host = 1.2.3.4 port = 1433 tds version = 7.3 client charset=UTF-8 #确保中文无乱码
检测是否安装成功
运行如下命令:
$ cd /usr/local/freetds/bin $ ./tsql -C
出现如下所示则表示安装成功:
Compile-time settings (established with the "configure" script) Version: freetds v0.95.92 freetds.conf directory: /usr/local/freetds/etc MS db-lib source compatibility: yes Sybase binary compatibility: no Thread safety: yes iconv library: yes TDS version: 7.3 iODBC: no unixodbc: no SSPI "trusted" logins: no Kerberos: no OpenSSL: no GnuTLS: no
更详细的的配置可官方文档:http://www.freetds.org/userguide/config.htm
尝试连接MSSQL
进入 freetds 安装目录,执行如下命令:
$ cd /usr/local/freetds/bin $ ./tsql -H 192.168.0.254 -p 1433 -U sa -P 123456
出现如下则表示测试连接成功
locale is "zh_CN.UTF-8" locale charset is "UTF-8" using default charset "UTF-8" 1> # 按 ctrl + C 退出
注释:
-H 是MSSQL服务器地址,可测试远程地址 -p 是端口号 -U 是数据库用户名 -P 是数据库密码
编译PHP扩展 mssql
mssql扩展库添加后,PHP中可使用如下代码来连接mssql
$con = mssql_connect('host:1433','user','password') or die("SQL SERVER 数据库连接失败!");
可先去PHP官网下载对应版本的PHP完整包并解压,这里以 php-5.4.41 为例
# 进入mssql模块源码目录 $ cd php-5.4.41/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
make install 之后的运行结果:
Build complete. Don't forget to run 'make test'. Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/
在上述目录中生成了 mssql.so 文件,接着编辑 php.ini ,增加 mssql 扩展库支持
$ vi /usr/local/php/etc/php.ini # 启用如下,如无则添加。(在vi状态中可使用 /extension 来搜索,按n搜索下一项) extension = "mssql.so" # 保存并重启 $ /root/lnmp restart # 查看是否配置成功 $ /usr/local/php/bin/php -m
编译PHP扩展 PDO_DBLIB 库
pdo_dblib 扩展库添加后,PHP中可使用如下代码来连接 mssql
$con = new PDO("dblib:host=myHost;dbname=myDB","myUserName","myPassword");
可先去PHP官网下载对应版本的PHP完整包并解压,这里以 php-5.4.41 为例
# 进入mssql模块源码目录 $ cd php-5.4.41/ext/pdo_dblib # 生成编译配置文件 $ /usr/local/php/bin/phpize # 编译安装 $ ./configure --with-php-config=/usr/local/php/bin/php-config --with-pdo_dblib=/usr/local/freetds $ make && make install
安装完成后会在如下目录生成 pdo_dblib.so 文件
Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/
接着编辑 php.ini ,增加 pdo_dblib 扩展库支持
$ vi /usr/local/php/etc/php.ini # 启用如下,如无则添加 extension = "pdo_dblib.so" # 保存并重启 $ /root/lnmp restart # 查看是否配置成功 $ /usr/local/php/bin/php -m
MSSQL 编码
最后注意一下,PHP读取MSSQL可能会出现乱码情况,可以在 php.ini 中指定mssql语言集,命令如下:
## 编辑 php.ini $ vi /usr/local/php/etc/php.ini ## 搜索关键词 $ /mssql.charset ## 按n搜索下一项 ## 在如下行下面再添加一行 GBK ;mssql.charset = "ISO-8859-1" mssql.charset = "utf8"
注:是utf8还是gbk,要根据PHP程序的文件编码决定。