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

とある方の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をインストール

```bash:install_php
$ sudo apt -y install php7.0 mcrypt php7.0-mcrypt php-mbstring php-pear php7.0-dev

```

```bash: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
```

```bash: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)
```

```bash: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
```

```bash: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から見てみましょう。

```sql: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から表示

```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:実行結果
$ php postalcode.php
Array
(
    [郵便番号] => 6040905
    [市区町村] => 京都市中京区
    [住所それ以降] => 梅之木町（新烏丸通竹屋町上る、新烏丸通竹屋町下る、新烏丸通夷川上る、
)
Array
(
    [郵便番号] => 6040905
    [市区町村] => 京都市中京区
    [住所それ以降] => 夷川通新烏丸東入、夷川通新椹木町西入、竹屋町通新烏丸東入、竹屋町通椹木
)
Array
(
    [郵便番号] => 6040905
    [市区町村] => 京都市中京区
    [住所それ以降] => 町西入、新烏丸通御霊図子下る）
)

```

よし、使える。




## 参考サイト
[SQL Server - Getting Started PHP-Ubuntu](https://www.microsoft.com/en-us/sql-server/developer-get-started/php/ubuntu/)
SQL ServerのUbuntu版をインストールするところから説明している。
今回は1のInstall sqlcmd Command Line Utility for SQL Server と
2 を参考にしている。

[Microsoft msphpsql - Github Repo](https://github.com/Microsoft/msphpsql)

[PHP and SQL Server for Linux](https://framework.zend.com/blog/2017-02-14-php-sql-server-linux.html)
zendのblog、導入のやり方がDebian/Ubuntuの流儀に近い。

[Microsoft® ODBC Driver 13 for SQL Server® - Windows + Linux](https://www.microsoft.com/en-us/download/details.aspx?id=50420)
動作環境等が書かれている。
SQL Server2000 2005は動作対象外