とある方の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をインストール
$ sudo apt -y install php7.0 mcrypt php7.0-mcrypt php-mbstring php-pear php7.0-dev
$ 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
$ 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)
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
$ 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 -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から表示
<?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は動作対象外