Edited at

LinuxからSQL ServerにODBCで接続する

More than 3 years have passed since last update.


はじめに

PHPでMSSQL関数に繋いでデータを取得するのは前回に説明しました。

しかし、検索を掛ける限りODBCで接続することが多いようです。

今度はLinuxからSQL ServerにODBCで接続する方法を説明します。

この回では、isqlにて接続確認を行うところまで説明します。


接続イメージ

ODBC関数(PHP,Perl,Ruby等) <-> unixODBC <-> FreeTDS <-> SQL Server

LinuxからODBCでSQL Serverに接続する設定は、PHPでもPerlでもRubyでも、

isqlで接続確認するまでの過程は全く変わりません。PerlやRuby、Python等で接続される方も参考になるかと思います。


環境


ホスト


  • SQL Server 2008R2 Express

  • WindowsXP


クライアント


  • Ubuntu 12.04.3LTS


ライブラリーをインストール


unixodbc


  • unixODBC

  • ODBCドライバーを扱うためのドライバーマネージャー


tdsodbc


  • FreeTDSのODBC接続API


freetds-common


  • FreeTDS

  • SQL ServerやSybaseへ接続するためのプロトコル

上記のドライバを下記のようにインストールします。


ドライバーインストール

$ sudo apt-get install freetds-common tdsodbc unixodbc


必要なライブラリやソフトはインストールできました。

次は設定を行っていきます。


DSN-Onlyという方法を説明

Preparting ODBCによると、

LinuxからODBCへ接続する方法は3種類ある。


DSN-less


  • odbc.iniもfreetds.confも使わずに接続する方法。

  • ソースに接続文字列を書いて接続します。


DSN-Only


  • odbc.iniの設定だけで接続する方法。


DSN-Combine


  • odbc.iniとfreetds.confの設定を使う。

  • freetds.confはDSNの設定のservernameの項目で使われる。

DSN-lessの接続は私の設定では巧くいかなかった。

DSN-OnlyとDSN-Combineについては成功した。

今回は DSN Onlyで接続する方法 を説明する。


ODBCINSTで設定

unixodbcでdriverやDataSource Name(DSN)等の設定は、iniファイルに設定ファイルを書くか、

odbcinstというツールを使って設定します。

ここではodbcinstを使った設定を説明します。


unixODBCにODBC用のFreeTDSドライバーを登録


ODBCドライバーの場所の特定

FreeTDSのODBCドライバーの場所を特定します。

下記のようにコマンドを実行して探し出します。


場所の特定

$ sudo updatedb

$ locate tdsodbc
/usr/lib/i386-linux-gnu/odbc/libtdsodbc.so
....(省略)...

libtdsodbc.soがインストールしたFreeTDSのODBCドライバーを表しています。

/usr/lib/i386-linux-gnu/odbc のフォルダの中には

libtdsS.so があります。

これはセットアップファイルです。

$ ls /usr/lib/i386-linux-gun/odbc/*tdsS*

/usr/lib/i386-linux-gnu/odbc/libtdsS.so

以下の2つのPathを覚えておきましょう。


ODBCドライバーの場所

/usr/lib/i386-linux-gnu/odbc/libtdsodbc.so


ドライバーのセットアップファイルの場所

/usr/lib/i386-linux-gnu/odbc/libtdsS.so


ドライバーテンプレートファイルの作成

下記のようにテンプレートファイルを作ります。

$ vi driver.template

[FreeTDS]
#ドライバーの説明
Description = FreeTDS for SQL Server
#ODBCドライバーの場所
Driver = /usr/lib/i386-linux-gnu/odbc/libtdsodbc.so
#ドライバーのセットアップファイルの場所
Setup = /usr/lib/i386-linux-gnu/odbc/libtdsS.so


ドライバーのインストール

下記のように実行します。

$sudo odbcinst -i -d -f driver.templat


  • -i インストール

  • -d ドライバー

  • -f テンプレートファイル名

ODBCドライバーのインストールは root権限 で行って下さい。root権限以外で実行すると下記のようなエラーが出てインストールできません。

odbcinst: SQLInstallDriverEx failed with Invalid install path.


ドライバーのアンインストール

ドライバーをアンインストールするには下記のように行います。

ドライバー名を確認

$ odbcinst -q -d

[FreeTDS]


  • -q 検索

  • -d ドライバー

ドライバーアンインストール

$ sudo odbcinst -u -d -n DriverName


  • -u アンインストール

  • -n ドライバー又はDSN名


データソースの設定

以下の条件でデータソースを登録します。


ホスト


  • SQL Server 2008 R2

  • 文字コード: CP932

  • IP: 192.168.0.3

  • DB username: sa

  • DB password password


クライアント


  • Ubuntu 12.03

  • 文字コード: UTF-8

上記の条件を元にデータソーステンプレートを作成します。


データソーステンプレートの作成


データソーステンプレート

    $ vi dsn.template

[2008R2]
#ドライバーの説明
Description = SQL Server2008R2
#ドライバーの場所 
# ドライバーのフルパスか
# ドライバー名(ここではFreeTDS)を記述する
Driver = /usr/lib/i386-linux-gnu/odbc/libtdsodbc.so
#トレースするかの有無
Trace = No
#データベースのIPアドレス
Server = 192.168.0.3
#データベース名
Database = arakawa
#ポート番号 SQL Serverは通常 1433
Port = 1433
#TDS_Version SQLServer2000は7.1 SQLServer2005以降は7.2
TDS_Version = 7.2
#クライアント(Linux側)の文字コードセット
ClientCharset = UTF-8


データソースのインストール

データソースを設定したテンプレートのある場所で、

下記のようなコマンドでインストールします。

$ sudo odbcinst -i -s -l -f dsn.template


  • -i インストール

  • -s DSN(データソース名)

  • -l system dsn

  • -f テンプレートのファイル名

下記のようにユーザー権限でインストールしてしまうと、

/home/users/.odbc.ini

にDSN名が書き込まれてしまう。

$ odbcinst -i -s -f dsn.template

$ cat /home/users/.odbc.ini
[2008R2]
Description = ODBC Driver for SQL Server2008R2
......

ApacheのようなWebserverはSystem Datasource(system dsn)しか使いません。

なので、 ルート権限system dsn を登録する必要があります。

下記サイトのSystem versus Userを参照

unixODBC without GUI


データソースのアンインストール

データソースをアンインストールする場合は下記のように行います。

データソース名を検索

$ odbcinst -q -s

[2008R2]

データソースを削除

$ odbcinst -u -s -n 2008R2


データベース接続確認

これで、isqlで接続できるか確認します。

下記のように接続します。

$isql -v 2008R2 sa password

+---------------------------------------+
| Connected!
|
| sql-statement
| help [tablename]
| quit
|
+---------------------------------------+
SQL>

試しに以下のようなSQLを実行してみましょう

SQL>Select @@version


--------------------------------------------------------------+
| Microsoft SQL Server 2008 R2 (SP2) - 10.50.4000.0 (Intel X86)
Jun 28 2012 08:42:37
Copyright (c) Microsoft Corporation
Express Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 3)

|
+--------------------------------------------------------------+
SQLRowCount returns 1
1 rows fetched

サーバーのバージョンが出てきました。

成功です。

日本語文字列が文字化けするかも調査してみます。


データベース作成

SQL>CREATE DATABASE 日本語テーブル達

SQLRowCount returns -1


使用するDBを変更

SQL> use 日本語テーブル達

[01000][unixODBC][FreeTDS][SQL Server]Changed database context to '日本語テーブ
ル達'
.
[ISQL]INFO: SQLExecute returned SQL_SUCCESS_WITH_INFO
SQLRowCount returns -1


テーブル作成

SQL> create table 名前リスト(ID int IDENTITY(1,1) PRIMARY KEY,名前 nvarchar(40))

SQLRowCount returns -1


データ挿入

SQL> insert into 名前リスト(名前) values('織田 信長')

SQLRowCount returns 1


データ表示

SQL> select * from 名前リスト

+------------+-----------------------------------------+
| ID | 名前 |
+------------+-----------------------------------------+
| 1 | 織田 信長 |
+------------+-----------------------------------------+
SQLRowCount returns 1
1 rows fetched
SQL>

文字化けしていなければ問題なし。

後は、PHPやPerl,Ruby,Python等のODBCドライバーで接続の設定をしていきましょう。

私はPHPを使いますのでPHPの設定を説明します。

下記urlで見て下さい。

Linux PHPからODBCでSQL Serverに接続

Linux PerlからODBCでSQL Serverに接続