首页 资讯 农业 汽车 房产 科技 养老 教育 展会 自媒体
智能 互联网 摄影 手机 VR

Linux上Perl连接Windows上的SQL server包括字符集乱码踩坑

来源:互联网 作者:高晓娜 人气: 发布时间:2018-12-19
perl这套东西真是让人头大,这次使用Perl的catalyst框架做一个数据导出工作遇到了一些麻烦,网上很难找到关于catalyst的资料,真是难为人,Linux系统下的Perl怎么连接Windows上的SQL server数据库,在Linux下安装一个SQL server数据库再把数据导入吗?显然这是很愚蠢的方法。配好环境后一顿开心结果遇到字符集乱码问题凉凉,所以注意后面的freetd配置步骤。

环境配置
环境配置很关键也很多坑
需要的模块
unixodbc(Linux系统的ODBC)下载地址
freetds 或者(Sybase的驱动) 下载地址
DBD-ODBC(Perl的ODBC) 下载地址
本次测试安装的版本 DBD-ODBC-1.43 freetds-0.82 unixODBC-2.3.7(数据库版本不同可能需要改变模块的版本)SQL server2008R2数据库以及Perl5.6
安装
1.安装unixODBC
tar vxzf unixODBC-2.2.8.tar.gz
cd unixODBC-2.2.8
./configure --prefix=/xxx/xxx/unixODBC (安装路径)
make
make install
2、安装freetds
#tar vxzf freetds-0.82.4.tar.gz
#cd freetds-0.82.4
#/configure --prefix=/xxx/xxx/freetds(安装路径) --with-unixodbc=/usr/local/unixODBC --with-tdsver=8.0
#make
#make install
3、安装DBD-ODBC

注这里我以前连接Oracle安装过DBI所以不再安装
在安装之前要先设置一下环境变量
#export ODBCHOME=/xxx/xxx/unixODBC
export LD_LIBRARY_PATH=/xxx/xxx/lib
之后开始编译安装
#tar vxzf DBD-ODBC-1.12.tar.gz
#cd DBD-ODBC-1.12
#perl Makefile.PL
#make (这一步可能会出错,没有makefile文件,检查环境变量配置,解压目录有Makefile文件就课执行)
#make install

配置
1、 freetdsd 配置
#cd /xxx/xxx/freetds 进入自定义安装的目录
#vi freetds.conf
   添加如下内容:
[MyServer2k]       客户端使用的服务器名称(自己取)
host=192.168.0.1     SQLServer服务器的IP地址
port=1433        端口
tds version=8.0 (与freetds安装时指定的tds版本一致)
测试连接;
    # bin/tsql -S MyServer2k -H 192.168.0.1 -p 1433 -U sa -P password
    1> use xxx (xxx为配置freetds自己取的服务名例如这里的MyServer2k)
    2> go
    1> select count(*) from xxx (执行SQL语句看是否配置成功)
    2>
    4
    1> quit
    说明:-S MyServer2k是在freetds.conf中定义好的,-H 192.168.0.1服务器IP地址,和freetds.conf中的一致,-S这个参数可以不用 -p 1433用来指定端口是1433 ,-U sa用来指定连接数据库的用户名,-P password用来指定连接数据库的密码。
2、 配置unixODBC
#cd /xxx/xxx/unixODBC
  向ODBC添加SQLServer驱动
#vi odbcinst.ini
    写入如下内容:            
    [TDS]     驱动名称,自己随便起,记住名字后面会用
    Description = MS-SQLServer       驱动的描述
    Driver = /xxx/xxx/lib/libtdsodbc.so  
    Setup = /xxx/xxx/lib/libtds.so     
    FileUsage = 1
    保存退出
    添加DSN
    # vi odbc.ini
    这步很关键
    写入如下内容       说明
    [123]           DSN名称,随便起
    Driver = TDS        ODBC驱动,上面odbcinst.ini文件里面的驱动名称
    Server = 192.168.0.1  服务器IP (-注意这里最好是填刚才配置发freetds名称例如MyServer2k, 解决字符乱码也在这一步,这里填IP的话在freetds填写client charset = UTF-8是不起作用的,出现乱码用什么encode,decode都是无法正常转码的亲测。)
    Database = xxx       数据库名字 (多个数据库同时写在一个DNS没有测试)
    Port = 1433        端口
 保存并退出,测试ODBC的连接,最好是将安装的bin目录添加到环境变量,不然每次都需输入全路径
    # bin/isql -v 123 user password (-v是DNS名字,后面接用户名和密码)
    SQL> select count(*) from xxx
      ±---------+
      | |
      ±---------+
      | 4 |
      ±---------+
    SQL> quit
Perl脚本测试
pe `help’ to learn how to use Xshell prompt.
1 #!/usr/bin/perl
2 use DBI;
3 use utf8;
4 use JSON;
5 use Encode;
6
7 $ENV{NLS_LANG} = “SIMPLIFIED CHINESE_CHINA.ZHS16GBK”; (忽略这句,这是我测试gbk转码时测试用)
8 $dbh=DBI->connect(‘dbi:ODBC:xxx’,‘user’,‘passwd’); (xxx为unixodbc配置的DNS名称)
9 my sth=sth=sth=dbh->prepare(“SELECT * from v_sdcx_yd_30 where zgh=‘2014046’”);
10 KaTeX parse error: Expected 'EOF', got '#' at position 21: …execute();
11 #? while (@data=sth->fetchrow_array()){
12 #  print “okn”;
13 # }
14 @data=$sth->fetchrow_array();
15 decode(“gbk”,@data[1]);
16 print “@datan”;
17








免责声明:本文仅代表作者个人观点,与华纳网无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
责任编辑:高晓娜
地址: 辽宁省大连市中山区港湾街20号名仕财富中心B座1517室 联系电话: 0411-84950851 邮箱:info@worldwarner.com
© 2017 大连华纳文化传媒有限公司 All rights reserved
经营许可证编号:辽B2-20170212 备案号:辽ICP备17007383号-2
辽公网安备 21021102000241