Raspi3B + Ubuntu 20.04 から Windows 10 + SQL Server 2019 Express にアクセスしてみる

# 目的
そこにUbuntu 20.04をインストールしたRaspi3Bが見えたのでつい試してみる
SQL Server関連のパッケージは今のところarm版にはリリースされていないようなので、tdsodbc、unixodbcを使用して接続してみる
※ほぼ[Linux PHPからSQL Serverに接続](https://qiita.com/arachan@github/items/026091e69e1aba7b0918)の手順通り
phpのコードはnginxとCLI共に同一コードで確認(nginx+php-fpmはまとめ中)

## 必要なパッケージをインストールする

<pre>
$ sudo apt install freetds-common freetds-bin tdsodbc unixodbc

※perl関連のパッケージ
$ sudo apt install perl-doc
$ sudo apt install cpanminus
$ sudo cpanm install DBD::ODBC
$ sudo cpanm install DDP
$ sudo apt install libdbd-odbc-perl

※アンインストールは以下で行う
$ sudo cpanm -U DBD::ODBC -y
$ sudo cpanm -U DDP -y

※nginxとphp-fpm関連のパッケージ
$ sudo apt install nginx
$ sudo apt install php-fpm
$ sudo apt install php7.4-odbc
$ sudo apt install php7.4-mysql ※これはメモ
</pre>

## FreeTDSの設定
man tsqlより
　-C print some of the compile-time configuration parameters.
<pre>
$ sudo tsql -C
Compile-time settings (established with the "configure" script)
                            Version: freetds v1.1.6
             freetds.conf directory: /etc/freetds
     MS db-lib source compatibility: no
        Sybase binary compatibility: yes
                      Thread safety: yes
                      iconv library: yes
                        TDS version: auto
                              iODBC: no
                           unixodbc: yes
              SSPI "trusted" logins: no
                           Kerberos: yes
                            OpenSSL: no
                             GnuTLS: yes
                               MARS: yes
</pre>

/etc/freetds/freetds.confを修正する
※@arachan@githubさんの指摘により以下を修正
(修正前)tds version = 8.0
(修正後)tds version = auto
※マニュアルよもうぜ・・・
<pre>
[tdssqlserver]
host = 192.168.5.xxx
port = 1433
tds version = auto
</pre>

SQL Serverに接続可能かを確認する
man tsqlより
-S servername
　database server to which to connect.
-U username
　database login name. If username is not provided,
　a domain login is attempted for TDS 7+ connections.
-P password
　database password.

<pre>
$ sudo tsql -S tdssqlserver -U demo -P demo
locale is "C.UTF-8"
locale charset is "UTF-8"
using default charset "UTF-8"
1> quit
</pre>

## unixODBCの設定
/etc/odbc.iniを修正する
<pre>
[sqlserver]
Description = MS SQL Server
Driver = /usr/lib/arm-linux-gnueabihf/odbc/libtdsodbc.so
Servername = tdssqlserver
Database = AdventureWorksLT2019
</pre>

man odbcinsより
　odbcinst - An unixODBC tool for manipulating configuration files

<pre>
$ sudo odbcinst -i -d -f /etc/odbc.ini
odbcinst: Driver installed. Usage count increased to 1.
    Target directory is /etc
  -i インストール
  -d ドライバー
  -f テンプレートファイル名

$ sudo odbcinst -q -d
[sqlserver]
  -q 検索
  -d ドライバー

$ sudo odbcinst -u -d -n sqlserver
sqlserver has been deleted (if it existed at all) because its usage count became zero
  -u アンインストール
  -n ドライバー又はDSN名
</pre>

## Ubuntu+DBD::ODBC->Win10+SQLServer2019Express
DBI::ODBCでアクセスしてみる

```python
use strict;
use utf8;
use DBI;

my $dbh=DBI->connect('dbi:ODBC:sqlserver','demo','demo') or die $!;
my $sth=$dbh->prepare("select * from SalesLT.Address") or die $dbh->errstr;

# 出力エラー対策
$sth->{LongTruncOk}=1;
$sth->{LongReadLen}=2000000;

$sth->execute or die $dbh->errstr;
while(my $arrayref = $sth->fetchrow_arrayref){
        use DDP;
        p $arrayref;
}
$sth->finish;
$dbh->disconnect;
```

## Ubuntu+PHP-FPM->Win10+SQLServer2019Express

```php
<?php
    $dsn = 'odbc:sqlserver';
    $user = 'demo';
    $password = 'demo';

    $dbh = new PDO($dsn, $user, $password);

    $sql = "select * from SalesLT.Address";
    foreach ($dbh->query($sql) as $row) {
        print($row['AddressID'] . ' ' . $row['AddressLine1'].'<br>');
    }

    $dbh = null;
?>
```

# 参考にしたのは以下のサイト
[CentOS上でPerlのDBIを使ってSQL Serverに接続する手順](https://tutorial.perlzemi.com/blog/20101218130016.html)
[LinuxからSQL ServerにODBCで接続する](https://qiita.com/arachan@github/items/5863c945dbe7507975d8)
[Connect PHP to MSSQL via PDO ODBC](https://stackoverflow.com/questions/20163776/connect-php-to-mssql-via-pdo-odbc)
[cpanm - CPANからモジュールを取得、アンパック、インストールする](http://perldoc.jp/docs/modules/App-cpanminus-1.7001/lib/App/cpanminus/fatscript.pod)