Edited at

Microsoft公式ドライバーでUbuntuからSQLServerを見に行く

More than 1 year has passed since last update.

とある方のTLでUbuntuにもMicrosoft公式のSQLServerのドライバーが提供されていることを知りました。

FreeTDSで必死につなぎに行った私が試さないわけにはいかないでしょう。

SQL ServerからVB.Netまで全てMicrosoftで揃えているシステムはデータベース名もテーブル名もカラム名も全て日本語で書いてあります。

変数名や関数名も日本語で書いても動くので何の悪気もありません。

勿論、Linuxから見る場合はもう、棘(いばら)の道決定。orz

では頑張っていきましょう。


環境

Client


  • Ubuntu 16.04.2 LTS (x86_64)

  • PHP7.0

Server


  • Windows Server 2012R2

  • SQL Server 2016 Express


特殊な条件


  • データベース名、テーブル名、カラム名は全て日本語

  • 10万件以上のBigData


設定

phpをcliで実行して確かめるのでapacheは入れません。


PHPをインストール


install_php

$ sudo apt -y install php7.0 mcrypt php7.0-mcrypt php-mbstring php-pear php7.0-dev



msql-toolsをインストール

$ sudo su

$ curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
$ curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list > /etc/apt/sources.list.d/mssql-release.list
$ exit
$ sudo apt update
$ sudo ACCEPT_EULA=Y apt install mssql-tools
$ sudo apt install unixodbc-dev
$ echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bash_profile
$ echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc
$ source ~/.bashrc


SQL_ServerのVersion確認クエリー

$ sqlcmd -S ServerAddress -U sa -P yourpassword -Q "SELECT @@VERSION"

-----------------------------------------------------------------------------------------------------------
Microsoft SQL Server 2016 (RTM) - 13.0.1601.5 (X64)
Apr 29 2016 23:23:58
Copyright (c) Microsoft Corporation
Express Edition (64-bit) on Windows Server 2012 R2 Datacenter Evaluation 6.3 <X64> (Build 9600: )

(1 rows affected)



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

sudo apt update

sudo ACCEPT_EULA=Y apt install msodbcsql
sudo apt install unixodbc-dev gcc g++ build-essential
sudo pecl install sqlsrv pdo_sqlsrv


sqlsrv,pdo_sqlsrvの有効化

$ sudo touch /etc/php/7.0/mods-available/sqlsrv.ini

$ sudo echo "extension=sqlsrv.so" > /etc/php/7.0/mods-available/sqlsrv.ini
$ sudo touch /etc/php/7.0/mods-available/pdo_sqlsrv.ini
$ sudo echo "extension=pdo_sqlsrv.so" > /etc/php/7.0/mods-available/pdo_sqlsrv.ini
$ sudo phpenmod -v 7.0 -s cli sqlsrv pdo_sqlsrv

これで設定完了。

今回はSQL Serverに郵便番号のデータをインポートしておきました。

124114件あります。

データベース名もテーブル名もカラム名も日本語で作りました。

これをPHPから見てみましょう。


sqlcmdでSQLServerのデータを見る

~$ sqlcmd -S 192.168.0.3 -U sa -P Password

1> use 日本語システム
2> go
データベース コンテキストが '日本語システム' に変更されました。
1> select top 3 郵便番号,都道府県,市区町村,住所それ以降 from 郵便
2> go
郵便番号 都道府県 市区町村 住所それ以降
------- -------- ------------- --------------------
0600000 北海道 札幌市中央区 以下に掲載がない場合
0640941 北海道 札幌市中央区 旭ケ丘
0600041 北海道 札幌市中央区 大通東

(3 rows affected)



PHPから表示


postalcode.php

<?php

$serverName="192.168.0.3";
$connectionOptions=array(
"Database"=>"日本語システム",
"Uid"=>"sa",
"PWD"=>"Password"
);

//Establishes the connection
$conn = sqlsrv_connect($serverName, $connectionOptions);
//if($conn)
// echo "Connected!";

$tsql="SELECT 郵便番号,市区町村,住所それ以降 FROM 郵便 WHERE 郵便番号=6040905";

$getProducts = sqlsrv_query($conn, $tsql);

if ($getProducts == FALSE)
die(FormatErrors(sqlsrv_errors()));

$productCount = 0;

while($row = sqlsrv_fetch_array($getProducts, SQLSRV_FETCH_ASSOC))
{
print_r($row);
$productCount++;
}
sqlsrv_free_stmt($getProducts);
sqlsrv_close($conn);

function FormatErrors( $errors )
{
echo "Error information: ";

foreach ( $errors as $error )
{
echo "SQLSTATE: ".$error['SQLSTATE']."";
echo "Code: ".$error['code']."";
echo "Message: ".$error['message']."";
}
}

?>



実行結果

$ php postalcode.php

Array
(
[郵便番号] => 6040905
[市区町村] => 京都市中京区
[住所それ以降] => 梅之木町新烏丸通竹屋町上る新烏丸通竹屋町下る新烏丸通夷川上る
)
Array
(
[郵便番号] => 6040905
[市区町村] => 京都市中京区
[住所それ以降] => 夷川通新烏丸東入夷川通新椹木町西入竹屋町通新烏丸東入竹屋町通椹木
)
Array
(
[郵便番号] => 6040905
[市区町村] => 京都市中京区
[住所それ以降] => 町西入新烏丸通御霊図子下る
)


よし、使える。


参考サイト

SQL Server - Getting Started PHP-Ubuntu

SQL ServerのUbuntu版をインストールするところから説明している。

今回は1のInstall sqlcmd Command Line Utility for SQL Server と

2 を参考にしている。

Microsoft msphpsql - Github Repo

PHP and SQL Server for Linux

zendのblog、導入のやり方がDebian/Ubuntuの流儀に近い。

Microsoft® ODBC Driver 13 for SQL Server® - Windows + Linux

動作環境等が書かれている。

SQL Server2000 2005は動作対象外