Maison > Article > base de données > perl通过unixODBC连接SQLServer
本文讲述三个内容: 一:说明 二:环境配置 三:操作脚本内容 一:说明 MS从来没有提供过SQLServer for Linux,所以大家也不要去尝试在Linux系统安装SQLServer,但是可以 通过 ODBC 连接 Windows系统的SQLServer数据库; WindowsServer 2003用户注意: 在Windows Se
本文讲述三个内容:
一:说明
二:环境配置
三:操作脚本内容
一:说明
MS从来没有提供过SQLServer for Linux,所以大家也不要去尝试在Linux系统安装SQLServer,但是可以通过ODBC连接Windows系统的SQLServer数据库;
WindowsServer 2003用户注意:
在Windows Server 2003系统上安装的SQLServer是不会打开1433端口的,所以请Windows2003用户在安装完SQLServer之后一定装上SQLServer SP3布丁
二:安装相关驱动及环境配置
如果没安装DBI最好先安装DBI 不然后面会报错
DBI安装:DBI详细信息参考:http://dbi.perl.org/
1.下载DBI包:
下载地址:http://search.cpan.org/CPAN/authors/id/T/TI/TIMB/DBI-1.620.tar.gz
tar xzf DBI-1.620.tar.gz 进入解压包内 perl Makefile.PL make test make make install (如果不是root用户,要sudo一下)
1.下载相关软件 unixODBC、freetds和DBD-ODBC
首先需要下载3个文件:
Linux系统的ODBC
unixODBC-2.2.8.tar.gz ( http://www.unixodbc.org)
连接SQLServer或Sybase的驱动
freetds-0.62.4.tar.gz ( http://www.freetds.org)
perl的ODBC模块
DBD-ODBC-1.12.tar.gz ( http://cpan.perl.org)
把下载到的三个文件放到同一个目录
2.安装unixODBC
# tar vxzf unixODBC-2.2.8.tar.gz # cd unixODBC-2.2.8 # ./configure --prefix=/usr/local/unixODBC --enable-gui=no # make # make install
# tar vxzf freetds-0.62.4.tar.gz # cd freetds-0.62.4 # ./configure --prefix=/usr/local/freetds --with-unixodbc=/usr/local/unixODBC --with-tdsver=8.0 # make # make install
# export ODBCHOME=/usr/local/unixODBC
# tar vxzf DBD-ODBC-1.12.tar.gz # cd DBD-ODBC-1.12 # perl Makefile.PL # make # make install所有的软件到现在都安装完成了,接下来就是配置了
# cd /usr/local/freetds # vi etc/freetds.conf修改以下的一段,并把;去掉
其中的[MyServer2k]代表在客户端使用的服务器名称,host代表SQLServer服务器的IP地址,port代表端口,测试连接;
其配置项解释如下:
tds version: 指明tds协议的版本,连接数据库时使用,如果在环境变量中没有设置
此项,则由此配置决定,协议版本可取4.2,5.0,7.0,8.0。
host: 数据库服务器的主机名或者ip地址。
port: 数据库服务器的监听端口,可以取任何有效的端口值,一般而言Sybase SQL10以前为1433,10以上用5000,而Sybase SQLAnywhere 7是2638,Microsoft SQL server则用1433。此配置可以被环境变量中的TDSPORT改写。
initial block size: 此值只能取512的倍数,默认为512,指定了协议块的最大值,
一般不要改变此默认 配置。
dump file: 任何有效的文件名,指明了转储文件的路径并且会打开日志记录。
dump file append: yes或者no,决定是否追加保存到dump file文件中。
timeout:设置处理的最大等待时间。
connect timeout: 设置连接的最大等待时间。
emulate little endian: yes或者no,是否强制大端机使用小端方式与MS Server通信。
client charset: 任何有效的iconv字符集。默认值为ISO-8859-1,使FreeTDS使用iconv在数据库服务器和用户程序之间转换。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
注意, client charset 必需大于或等于服务端数据库使用的字符集.
例如,服务端数据库是 MS SQL Server 2000, 字符集是 GB2312.
那么 client charset 可以设置为 GB2312(等于), GB18030(大于),UTF-8(大于)但不能设为ISO-8859-1(小于), Shift_JIS(不等于).
由于 UTF-8 是所由字符集的超集,因此设置为 UTF-8 总是可行的.
此外, FreeTDS的client charset不能设置为 UTF16. 这时目前该软件设计的局限,其官方网站称,在未来版本中可能会增加对client charset UTF16的支持.
# bin/tsql -S MyServer2k -H 192.168.0.32 -p 1433 -U sa -P password 1> use gameDB 2> go 1> select count(*) from t_ip 2> go 4 1> quit一切都很顺利
# cd /usr/local/unixODBC
# vi etc/odbcinst.ini
或者
[FreeTDS]
Driver = /usr/local/freetds/lib/libtdsodbc.so
;Threading = 1
添加DSN
# cd /usr/local/unixODBC
# vi etc/odbc.ini
Stmt =
或者
[zzq_cq]
Driver = FreeTDS
Server = 192.168.0.89
Port = 1433
TDS_Version = 7.2
Database=db
User=sa
Password=123
client charset=utf-8
# bin/isql -v 123 sa passwordSQL> select count(*) from t_ip
# cp /usr/local/unixODBC/lib/libodbc.* /usr/lib
操作脚本时 如果报错:
install_driver(ODBC) failed: Can't load '/usr/local/lib64/perl5/auto/DBD/ODBC/ODBC.so' for module DBD::ODBC: libodbc.so.2: cannot open shared object file: No such file or directory at /usr/lib64/perl5/DynaLoader.pm line 200.
at (eval 5) line 3
Compilation failed in require at (eval 5) line 3.
Perhaps a required shared library or dll isn't installed where expected
at createalltable.pl line 27
则运行如下:
# find / -name "libodbc.so"
/usr/local/unixODBC/lib/libodbc.so
# echo "/usr/local/unixODBC/lib/" >> /etc/ld.so.conf
# ldconfig
三:操作脚本内容
# vi test.pl
}
资源释放语句,关闭语句(与mysql有点区别mysql可以直接disconnect):
$sth->finish;
$dbh->disconnect;
只单独disconnect会报错:
DBI::db=HASH(0x812938)->disconnect invalidates 1 active statement handle
(either destroy statement handles or call finish on them before disconnecting)
注意是 $sh对应位置的 变量 finish 而不是 $dbh
否则会报错:
Can't locate object method "finish" via package "DBI::db"
# perl test.pl
PS: 如果 你拿到一台机子 不知道 它的驱动 可以进入/usr/local/unixODBC/etc中查看配置文件 odbcinst.ini 和odbc.ini
参考资料:
http://space.itpub.net/82392/viewspace-238018
http://opsyun.blog.51cto.com/1037036/713910
PS:!!!!!注意 在linux中用perl提取sqlserver的数据时,linux系统的编码要跟sqlserver数据库的编码相同 不然 提取出的数据会是乱码。 比如 sqlserver中的数据是gbk 则运行perl的linux系统也必须设为 gbk的环境 用 export LANG=zh_CN.GBK 详见:mysql乱码问题完美解决篇(我用的perl其他语言类推可解)