|
|
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のインストールは一切不要ですのでかなり楽です。 |
| 実験環境 |
実験環境は以下の通りです。
・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は日本語処理を含め、まだ完全とは言えません。日々進化しているツールなので、常に最新のソースを取得した方が安定する場合があります。いずれ日本語処理などもきちんと対応するでしょうから、みんなで応援しましょう! |
関連リンク
IT技術研究のページに戻る
|
|
|