【Perl】LinuxからMicrosoft SQL Serverへアクセスする


PerlからMicrosoft SQL Serverにアクセスする場合、WindowsではOS標準のODBC機能(コントロールパネル→管理ツールから設定する)+DBD::ODBCが使える。

#!/usr/bin/perl
use DBI;
my $dbh = DBI->connect(
    "dbi:ODBC:Driver={SQL Server};"
    . "Server=サーバのIPアドレス;"
    . "database=データベース名;"
    . "uid=ユーザー名;"
    . "pwd=パスワード;" );

しかし、Unix系OSではこの手は使えない。unixODBCとFreeTDSという2つのソフトを介して接続することになる。

Milano::Monolog: unixODBC+FreeTDS+DBD::ODBCでSQL Serverに接続する
http://rebecca.ac/milano/mt/archives/001412.html

unixODBC
http://www.unixodbc.org/

FreeTDS.org
http://www.freetds.org/

インストール

以下の記述はCentOS 5.4で行ったときのものだ。又、リンク先のインストール例を参考にしたが、文字コード関連(libiconv)は現在のバージョンでは必要なくなっていた。

unixODBCのインストール

$ wget http://www.unixodbc.org/unixODBC-2.2.14-p2.tar.gz
$ tar zxvf unixODBC-2.2.14-p2.tar.gz
$ cd unixODBC-2.2.14-p2
$ ./configure
$ make
$ sudo make install

FreeTDSのインストール

$ wget ftp://ftp.ibiblio.org/pub/Linux/ALPHA/freetds/stable/freetds-stable.tgz
$ tar zxvf freetds-stable.tgz
$ cd freetds-0.82
$ ./configure
$ make
$ sudo make install

DBD::ODBCのインストール

ODBCHOME」という環境変数を設定する必要がある。

$ sudo ODBCHOME=/usr/local cpan -i DBD::ODBC

共有ライブラリを読み込む

インストールした共有ライブラリは/usr/local/libに置かれている。標準ではこのディレクトリを読んでくれないので、設定ファイルを作る必要がある。具体的には、/etc/ld.so.conf.d/locallib.confというファイルを作成し、中にパスを記述した上で、ldconfigコマンドを実行する。

$ cat > /etc/ld.so.conf.d/locallib.conf
/usr/local/lib
$ sudo /sbin/ldconfig

設定

/usr/local/etc/odbc.ini

ハイライトした「mssql」というのは任意の識別名。FreeTDSとの通信に使う。

[ODBC Data Sources]
freetds = FreeTDS ODBC Driver

[freetds]
Driver = /usr/local/lib/libtdsodbc.so
Description = Microsoft SQL Server
Servername = mssql
Database = データベース名

/usr/local/etc/freetds.conf

次の記述を追加する。

[mssql]
        host = サーバのIPアドレス
        port = 1433
        tds version = 7.0
        client charset = UTF-8
        language = japanese

実際に使ってみる

以上で設定は終了だ。実際にアクセスしてみよう。

#!/usr/bin/perl -l
use utf8;
use DBI;
use Encode;
binmode STDOUT => ":utf8";
my $dbh = DBI->connect(qw!
    dbi:ODBC:freetds
    ユーザー名
    パスワード
!) or die;
my $result = $dbh->selectrow_arrayref( <<SQL ) or die;
SELECT username FROM user_table WHERE id = 10
SQL
print decode_utf8( $result->[0] );

途中のSQL文は勿論例文ね。各自の環境に合わせて書き換える必要がある。又、出てくる結果はUTF-8にエンコードされているので、decode_utf8でフラグを立てよう。

コメントを残す