Debian + PHP 5.6からSQL Server 2016へ接続する
SQL Server 2016をインストールしてみました。SQL Server 2016 ExpressをWindows Server 2012 R2へインストール
Debian 8 + PHP 5.6から接続してみます。
下準備
事前にsampleというデータベースと、テーブルを作成しておきました。
大抵日本語が含まれる場合に躓くので、「日本語テーブル」というテーブル名とし、
「番号(int)」「日本語フィールド(nvarchar(50))」というフィールドを作成しています。
また、SQL Serverの認証モードは「混合」とし、ID、パスワードを用いて
接続できるよう構成しています。
さらに、別のサーバーから接続することになりますので、外部接続を許可しておきます。
SQL Server 2016 + Windows Server 2012 R2 外部接続許可
php5-mssql(php5-sybase)
mssqlというライブラリを使用してSQL Serverに接続することにしました。
http://php.net/manual/ja/book.mssql.php
Debianにはaptでインストールできます。
# apt-get install php5-mssql
ただし、これは「php5-sybase」のエイリアスとなっており、
実際には、freetdsとphp5-sybaseがインストールされます。
# apt-get install php5-mssql
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
Note, selecting 'php5-sybase' instead of 'php5-mssql'
以下の追加パッケージがインストールされます:
freetds-common libsybdb5
以下のパッケージが新たにインストールされます:
freetds-common libsybdb5 php5-sybase
アップグレード: 0 個、新規インストール: 3 個、削除: 0 個、保留: 0 個。
279 kB のアーカイブを取得する必要があります。
この操作後に追加で 714 kB のディスク容量が消費されます。
そのため、以下のコマンドと同義となります。
# apt-get install php5-sybase
サンプルプログラム(Mssql 関数)
事前にこんなデータを登録しておきます。
何か設定が不足しているのだと思うのですが、クエリーや結果はms932となっており、
適当にutf8と変換してやりました。
変換しないとこんなエラーになります。
PHP Warning: mssql_query(): message: Invalid object name '日本語テーブル'. (severity 16) in /var/dev/php/sample.php on line 7
PHP Warning: mssql_query(): General SQL Server error: Check messages from the SQL Server (severity 16) in /var/dev/php/sample.php on line 7
PHP Warning: mssql_query(): Query failed in /var/dev/php/sample.php on line 7
サンプルは以下のとおり。
- <?php
- // クエリーはms932で送る必要あり
- function ms932($value) {
- return mb_convert_encoding($value, 'ms932', 'utf-8');
- }
- // 結果がms932で帰ってくるので、utf8に変換
- function utf8($value) {
- return mb_convert_encoding($value, 'utf-8', 'ms932');
- }
- function conv($ary) {
- $result = array();
- foreach($ary as $k => $v) {
- $result[utf8($k)] = utf8($v);
- }
- return $result;
- }
- // サーバーに接続
- $link = mssql_connect('192.168.1.104:1433', 'sa', 'P@ssw0rd');
- mssql_select_db('sample', $link);
- // ms932に変換しつつselect実行
- $query = 'select * from 日本語テーブル';
- $result = mssql_query(ms932($query), $link);
- $numRows = mssql_num_rows($result);
- echo $numRows . PHP_EOL;
- // utf8に変換しつつ結果を表示
- while($row = mssql_fetch_array($result)) {
- $row = conv($row);
- echo '------'.PHP_EOL;
- echo $row['番号'] . PHP_EOL;
- echo $row['日本語フィールド1'] . PHP_EOL;
- echo '------'.PHP_EOL;
- }
- // 後始末
- mssql_free_result($result);
- mssql_close($link);
とりあえずこれで動いてくれました。
# php sample.php
1
------
12
日本語の値
------
PDO
PDOによる接続だとこうなりました。
- <?php
- function ms932($value) {
- return mb_convert_encoding($value, 'ms932', 'utf-8');
- }
- // 結果がms932で帰ってくるので、utf8に変換
- function utf8($value) {
- return mb_convert_encoding($value, 'utf-8', 'ms932');
- }
- function conv($ary) {
- $result = array();
- foreach($ary as $k => $v) {
- $result[utf8($k)] = utf8($v);
- }
- return $result;
- }
- try {
- $pdo = new PDO('dblib:host=192.168.1.104:1433;dbname=sample', 'sa', 'P@ssw0rd');
- $stmt = $pdo->query(ms932("select * from 日本語テーブル"));
- while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
- $row = conv($row);
- echo '------'.PHP_EOL;
- echo $row['番号'] . PHP_EOL;
- echo $row['日本語フィールド1'] . PHP_EOL;
- echo '------'.PHP_EOL;
- }
- } catch (PDOException $e) {
- echo $e->getMessage() . PHP_EOL;
- }
文字コードの自動変換
/etc/freetds/freetds.conf の設定値を変更しても、文字コードが自動的に変換されず。
[global]
# TDS protocol version
; tds version = 4.2
tds version = 8
charset = CP932
client charset = UTF-8
何を見落としているんだろう...
【参考URL】
sqlsrv driver on Linux?
- 関連記事
-
- Debian + CodeIgniter 3でSQL Server 2016に接続する
- Debian + PHP 5.6からSQL Server への接続で日本語が文字化けする場合の対応
- Debian + PHP 5.6からSQL Server 2016へ接続する
- PHP zipファイルを解凍せずにファイルの内容を読み取る
- jQuery + FileReader APIでファイルを分割し、バイナリでアップロード
コメント