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.htmlunixODBC
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
でフラグを立てよう。