有限会社横手ネットワーク研究所 トップページ
有限会社横手ネットワーク研究所 Webアプリ制作 有限会社横手ネットワーク研究所 ホームページ制作 有限会社横手ネットワーク研究所  有限会社横手ネットワーク研究所  有限会社横手ネットワーク研究所  有限会社横手ネットワーク研究所  有限会社横手ネットワーク研究所  有限会社横手ネットワーク研究所 
有限会社横手ネットワーク研究所 ドメイン取得 有限会社横手ネットワーク研究所 レンタルサーバー 有限会社横手ネットワーク研究所  有限会社横手ネットワーク研究所  パワーネット 有限会社横手ネットワーク研究所  有限会社横手ネットワーク研究所 
業務内容

Webアプリ制作
ホームページ制作
Webアプリ販売
サーバー構築
コンサルティング
パソコン110番

PowerNet
ドメイン取得
レンタルサーバー
ハウジング
プロバイダ申込
会社概要
IT技術研究
リンク集
お問い合わせ


 
FreeTDSとunixODBCを使ったSQL Server 2000のデータベース操作 2007年10月2日版

Linux用のFreeTDSとunixODBCを使って、マイクロソフトのSQL Server 2000のデータベースを操作する方法です。

何ができるの?

Windowsで動いているSQL ServerのデータベースをLinux側から操作することができます。いろいろ制限はありますが、基本的なデータの書き込み、読み込みができます。WebアプリケーションはLinux側で、データベースはWindowsのSQL Serverで運用するということが可能になります。 その他いろいろ使い道はあるはず!?



FreeTDS,unixODBCとは?
ざっくり言えばデータベースと通信をするツールです。このキーワードで検索すればいろいろ出てくるので自分で調べましょう(^_^)。
ばぁばのODBC実験室がお勧めです。


日本語での問題点
日本人が作ったソフトではないので、日本語での検証実験はあまり進んでいないようです。特に今回のようなケースの場合、Windows側のマイクロソフトが規定したEUCコードと、Linuxが使用しているEUCコードが微妙に違うために、一部の文字で文字化けなどが起こったりします。このように文字コードが微妙に絡んできますので、その部分に関してまだ不安定なところがあります。今回は日本語関係が正常に動くようにFreeTDSにパッチを適用してこの問題を回避します。
ちなみに、日本語を取り扱わないのであれば、パッチの適用やlibiconvのインストールは一切不要ですのでかなり楽です。


ソフトの入手
まずはソフト類を入手しましょう。

ソフト名 バージョン 入手先 参考ページ
FreeTDS 0.64(stable) (本体)
ftp://ftp.ibiblio.org/pub/Linux/ALPHA/freetds/stable/freetds-stable.tgz
(パッチ)
http://yokote.net/tech/linux/freetds/freetds-stable-0.64.patch
※上記リンクを右クリックし、「対象をファイルに保存...」を選択して保存してください。
http://www.freetds.org
unixODBC 2.2.7 http://www.unixodbc.org/unixODBC-2.2.7.tar.gz
※執筆時点での最新版は2.2.12ですが、FreeTDS 0.64でコンパイルエラーが起きたので使用しません。
http://www.unixodbc.org
libiconv 1.8 (本体)
http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.8.tar.gz
(パッチ)
http://www2d.biglobe.ne.jp/~msyk/software/libiconv-1.8-cp932-patch.diff.gz
http://www2d.biglobe.ne.jp/~msyk/software/libiconv-1.8-cp932-family.html
SQL Server 2000 SP3a マイクロソフト市販品です。 http://www.microsoft.com/japan/sql/default.mspx


実験環境
実験環境は以下の通りです。

・Linux側(クライアント側)
項目 内容 コメント
OS CentOS 5.0 カスタムインストールで、開発関連のソフトを全てインストールするようにして行いました。
Apacheでエラーが起こることがあるので、SELinuxに詳しくない人はSELinuxを無効にしておいた方がいいかもしれません。
IPアドレス 192.168.0.3  
ポート 1433 必ずこのポートを解放してください。解放しないと通信できなくなります。

・Windows側(サーバー側)
項目 内容 コメント
OS Windows 2000 念のためSP4を適用しておきました。
IPアドレス 192.168.0.2
ポート 1433 必ずこのポートを解放してください。解放しないと通信できなくなります。
これでハマることがあります。
データベース名 hogedb お好みの名前で作成してくださいね。
その他 作成したデータベースをODBC経由でアクセスできるようにアクセス権を設定して下さい。
これでハマることがあります。


unixODBCをインストールする
記事中のコマンドラインにおける「$」は一般ユーザー、「#」はrootを示しています。

・unixodbc-2.2.7.tar.gzを/usr/local/srcに展開する。
$ cd /usr/local/src
$ tar xzf unixodbc-2.2.7.tar.gz

・ソースディレクトリに移動してコンパイルし、インストールする。
$ cd unixodbc-2.2.7
$ ./configure --disable-gui
$ make
$ su
# make install

・設定ファイルを編集する。
/usr/local/etc/にodbc.iniがあるので、それを以下のようにする。

[ODBC Data Sources]
hogehoge= SQL Server ODBC Data Source

[hogehoge]
Driver = /usr/local/lib/libtdsodbc.so
Servername = sqlserver
Database = hogedb
Port = 1433


libiconvをインストールする
・libiconv-1.8.tar.gzを/usr/local/srcに展開する。
$ cd /usr/local/src
$ tar xzf libiconv-1.8.tar.gz

・パッチを適用する。
$ zcat libiconv-1.8-cp932-patch.diff.gz | patch -p0

・ソースディレクトリに移動してコンパイルし、インストールする。
$ cd libiconv-1.8
$ ./configure
$ make
$ su
# make install

これでWindowsのEUC「EUCJP-MS」が使用できるようになりました。


FreeTDSをインストールする
・freetds-stable.tgzを/usr/local/srcに展開する。
$ cd /usr/local/src
$ tar xzf freetds-stable.tgz

・ソースディレクトリに移動して、パッチを適用後コンパイルし、インストールする。
$ cd freetds-0.64
$ patch -p1 -d . < freetds-stable-0.64.patch
$ ./configure --with-unixodbc --with-tdsver=7.0 --with-msdblib --with-libiconv-prefix=/usr/local
$ make
$ su
# make install


・設定ファイルを編集する
/usr/local/etc/にfreetds.confがあるので、その最後の行に以下を追加する。

[sqlserver]
host = 192.168.0.2 ←SQL ServerをインストールしたホストのIPアドレスにすること
port = 1433
tds version = 7.0
client charset = EUCJP-MS
 ←データに日本語を使わないなら「UTF-8」にしても良い
language = english
 ←japaneseにするとエラーメッセージなどが日本語で表示されるが、環境によって文字化けする場合もあるのでenglishがお勧め。

ちなみに、パッチでは次のことを行っています。
(1)src/tds/encodings.h にEUCJP-MSというコードを追加
(2)src/tds/write.cの文字列バッファを256から100000に変更
どちらも日本語対策ですが、(2)に関してはサイズの大きさが適当であるかは不明です。とりあえずSQL文の長さよりも長くなるように余裕を持っておきました。


PHP 4.4.7をインストールする(参考)
これはapache 2.0.61とPostgreSQL 7.4.18を導入した場合の設定です。この手順でコンパイルしてもエラーになる場合がありますので、参考程度にして下さい。
ちなみに、apacheは/usr/local/apache、PostgreSQLは/usr/local/pgsqlにインストールしています。

・すでにRPMで導入済みの場合はRPMをアンインストールする。
以下のコマンドでエラーが出る場合は、付随するrpmも同時にアンインストールすること。
# rpm -e php

・php-4.4.7.tar.gzを/usr/local/srcに展開する。
$ cd /usr/local/src
$ tar xzf php-4.4.7.tar.gz

・ソースディレクトリに移動してコンパイルし、インストールする。
$ cd php-4.4.7
$ ./configure --with-pgsql --enable-mbstring --with-unixODBC --with-apxs2=/usr/local/apache/bin/apxs
$ make
$ su
# make install

# cp php.ini-dist /usr/local/lib/php.ini
※PHP3時代のプログラムと互換性を持たせる場合はphp.iniのregister_globalsという値をOnにすること。

・CentOS 5.0にインストールされていたオリジナルのPHPを無くし、今回インストールしたものが参照されるようにする。
# cd /usr/bin
# mv php php-orig
# ln -s /usr/local/bin/php

・apacheのhttpd.confの中に次の行を挿入してapacheを再起動する。
AddType application/x-httpd-php .php .inc .php3 .php4
※apache 1.3.xの場合は「<IfModule mod_mime.c>」〜「</IfModule>」の間に上記の行を入れます。


環境を整える
・ldconfigを実行する。
$ ldconfig

これを実行しないとWebサーバー経由のCGIでodbc_connet関数を呼び出した時に「Can't open lib '/usr/local/lib/libtdsodbc.so'・・・」のようなエラーが出るようです。


動かしてみる
日本語を取り扱うので、PHPで簡単なプログラムを書いて実行してみた方が楽ですね。

■SQL Serverのテーブルに
書き込むプログラム例
赤い文字のところは環境に合わせて修正して下さい。
また、下記の例の場合はあらかじめSQL Server側でhogedbというデータベース名でchartestというテーブルを作成し、mojiというフィールドを文字列型(varcharかtext型)で作成しておいてください。

<?php

define("ODBC_DB", "hogedb"); # データベース名
define("ODBC_ACCOUNT", "sa"); # アカウント名
define("ODBC_PASSWORD", ""); # パスワード
define("DB_TABLE", "chartest"); # テーブル名
define("DB_FIELD", "moji"); # 文字列を入れるフィールド名

$db_odbc = odbc_connect(ODBC_DB, ODBC_ACCOUNT, ODBC_PASSWORD);
if ($db_odbc == False) {
print("ODBC connection error.\n");
exit;
}

/* create SQL */
/* 下記の「1−2−3」 の部分をいろいろ変えて試してみて下さい */
$sql = sprintf("insert into %s(%s) values (%s)", DB_TABLE, DB_FIELD, "'1−2−3'");

/* encoding SQL */
/* このソースがEUCで書かれていれば次の行は不要です */
$sql = i18n_convert($sql, "EUC-JP");

/* exec SQL */
$rs = odbc_exec($db_odbc, $sql);
odbc_free_result($rs);

?>

上記のプログラムを例えばsample.php等というファイル名で保存し、次のようにして実行してみます。

$ php sample.php

特にエラーが表示されていなければ成功しているはずです。SQL Server側できちんと書き込まれているかを確認して下さい。
エラーが表示された場合は次の項目を確認して下さい。
(1)Linux側、SQL Server側で1433ポートが解放されているか。特に、セキュリティ対策ソフト(Norton,ウイルスバスターなど)やルーターでポートをブロックしていないか確認しましょう。
(2)設定したデータベース名、テーブル名、フィールド名、IPアドレスなどに整合性があるかを確認しましょう。
(3)FreeTDSなどのバージョンが正しいか、パッチが正常に当たっているかを確認しましょう。
(4)このページを疑いましょう(笑)。

ちなみに、freetds.confのclient charsetをEUCJPにすると、上記の「−」の部分が「?」に置き換わってしまうことが確認できるはずです。これが日本語処理の問題点と考えられます。


課題
FreeTDSは日本語処理を含め、まだ完全とは言えません。日々進化しているツールなので、常に最新のソースを取得した方が安定する場合があります。いずれ日本語処理などもきちんと対応するでしょうから、みんなで応援しましょう!


関連リンク
ばぁばのODBC実験室 かなり参考になります!

IT技術研究のページに戻る

Copyright (c) Yokote Network Laboratory Co., Ltd. Allrights reserved. since 2000