Symfoware

Symfowareについての考察blog

Debian + PHP 5.6からSQL Server への接続で日本語が文字化けする場合の対応

Debian 8 + PHP 5.6からSQL Server 2016へ接続してみました。
Debian + PHP 5.6からSQL Server 2016へ接続する

日本語をcp932でエンコードしないといけないのが面倒なので
utf-8でクエリーの実行や結果の受け取りを行う方法を調べてみました。


TDS protocol version



sqlsrv driver on Linux?
こちらで、tds versionを指定しています。

8.0じゃなくて8と指定したのがまずかったようで、
Choosing a TDS protocol version

ちゃんと8.0と設定ファイルに記載する必要があります。


# vi /etc/freetds/freetds.conf



tds versionを明記。
charsetの指定は不要でした。


[global]
        # TDS protocol version
;     tds version = 4.2
        tds version = 8.0

        # Whether to write a TDSDUMP file for diagnostic purposes
        # (setting this to /tmp is insecure on a multi-user system)
;     dump file = /tmp/freetds.log
;     debug flags = 0xffff






これだけで、今までの苦労が嘘みたいにutf-8で結果が帰ってくるようになりました。


  1. <?php
  2. // サーバーに接続
  3. $link = mssql_connect('192.168.1.104:1433', 'sa', 'P@ssw0rd');
  4. mssql_select_db('sample', $link);
  5. // 日本語のテーブル名を含むクエリーを実行
  6. $query = 'select * from 日本語テーブル';
  7. $result = mssql_query($query, $link);
  8. // 取得した検索結果の件数を表示
  9. $numRows = mssql_num_rows($result);
  10. echo $numRows . PHP_EOL;
  11. // 結果を表示
  12. while($row = mssql_fetch_array($result)) {
  13.     
  14.     echo '------'.PHP_EOL;
  15.     echo $row['番号'] . PHP_EOL;
  16.     echo $row['日本語フィールド1'] . PHP_EOL;
  17.     echo '------'.PHP_EOL;
  18. }
  19. // 後始末
  20. mssql_free_result($result);
  21. mssql_close($link);
  22. // PDO版
  23. /*
  24. try {
  25.     $pdo = new PDO('dblib:host=192.168.1.104:1433;dbname=sample', 'sa', 'P@ssw0rd');
  26.     $stmt = $pdo->query("select * from 日本語テーブル");
  27.     
  28.     while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
  29.         //$row = conv($row);
  30.         
  31.         echo '------'.PHP_EOL;
  32.         echo $row['番号'] . PHP_EOL;
  33.         echo $row['日本語フィールド1'] . PHP_EOL;
  34.         echo '------'.PHP_EOL;
  35.     }
  36.     
  37.     
  38. } catch (PDOException $e) {
  39.     echo $e->getMessage() . PHP_EOL;
  40. }
  41. */




実行結果


# php sample.php
1
------
12
日本語の値
------





当然、データの登録も問題ありません。


  1. <?php
  2. // サーバーに接続
  3. $link = mssql_connect('192.168.1.104:1433', 'sa', 'P@ssw0rd');
  4. mssql_select_db('sample', $link);
  5. // データの登録
  6. mssql_query("insert into 日本語テーブル (番号,日本語フィールド1) values (50, '日本語を登録')", $link);
  7. // 日本語のテーブル名を含むクエリーを実行
  8. $query = 'select * from 日本語テーブル';
  9. $result = mssql_query($query, $link);
  10. // 取得した検索結果の件数を表示
  11. $numRows = mssql_num_rows($result);
  12. echo $numRows . PHP_EOL;
  13. // 結果を表示
  14. while($row = mssql_fetch_array($result)) {
  15.     
  16.     echo '------'.PHP_EOL;
  17.     echo $row['番号'] . PHP_EOL;
  18.     echo $row['日本語フィールド1'] . PHP_EOL;
  19.     echo '------'.PHP_EOL;
  20. }
  21. // 後始末
  22. mssql_free_result($result);
  23. mssql_close($link);




実行結果


# php sample.php
2
------
12
日本語の値
------
------
50
日本語を登録
------





ドキュメントはちゃんと読めという教訓でした。


関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2016/06/21(火) 22:39:06|
  2. PHP
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<Debian + CodeIgniter 3でSQL Server 2016に接続する | ホーム | Debian + PHP 5.6からSQL Server 2016へ接続する>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1897-8461e67c
この記事にトラックバックする(FC2ブログユーザー)