質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

Webサーバー

Webサーバーとは、HTTPリクエストに応じて、クライアントに情報を提供するシステムです。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Windows Server

Windows Serverとは、Microsoft社のサーバ用オペレーティングシステムの総称です。 企業内ネットワークなどで利用されるサーバ機へ導入することを想定して開発されているため高い安定性があり、 管理機能を提供するソフトウェアが多く含まれています。

Q&A

解決済

1回答

3336閲覧

Microsoft ODBC Driver for SQL Server のApache経由のアクセスで文字化け

saza-e

総合スコア0

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

Webサーバー

Webサーバーとは、HTTPリクエストに応じて、クライアントに情報を提供するシステムです。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Windows Server

Windows Serverとは、Microsoft社のサーバ用オペレーティングシステムの総称です。 企業内ネットワークなどで利用されるサーバ機へ導入することを想定して開発されているため高い安定性があり、 管理機能を提供するソフトウェアが多く含まれています。

0グッド

0クリップ

投稿2020/06/23 11:49

##問題点
CentOS 7にMicrosoft ODBC Driver for SQL Serverをインストールし、PDOにてSQL Serverへの接続を試みていますが、マルチバイト(日本語)の文字列を送信すると文字化けが発生してしまいます。

##環境
環境は下記の通りです
・CentOS Linux release 7.6.1810
・WindowsServer 2012 SQL Server 14
・PHP 7.3.6
・Apache/2.4.6 (CentOS)

##症状
LinuxのWebサーバーから、WindowsのSQL Serverへ接続し、データの取得、更新を行う環境下において、SELECTを実行する際にWhere句内に日本語が含まれると、Latin-1に文字列が変換された状態でSQL Serverに送信されてしまいます。

Linuxにターミナルでログインし、コマンドライン上から同様のクエリを実行したときにはこの現象は発生せず、Apache経由で実行した場合のみこの症状が発生します。

はじめは、queryやexecでINSERTやUPDATEを実行した場合にも同様の症状が見られ、文字化けした状態でDBに格納されてしまう症状がありましたが、こちらはprepareを行い、executeを実行する形式に変える事で解消しました。
※この場合もコマンドラインからの実行の場合は文字化けしませんでした。

尚、php5.6とfreeTDS+unixODBC を用いた場合には問題なく動作していました。

##考えうる可能性
現在、prepareを実行する形でこの症状を回避していますが、そもそもの根本的な原因がしりたく、質問させて頂きました。
設定の見直しをしながら試行錯誤していますが、解決に至っていません。
現段階で考えている可能性を下記に記します。

###・Microsoft ODBC Driver for SQL ServerとMicrosoft SQL Server 用 Drivers for PHPのインストールの問題
Microsoft SQL Server 用 Drivers for PHP について、yumでのインストールのマニュアルの記載がありますがPHP自体をソースからビルドしてインスト―ルしているため、この手順をスキップしています。
これが原因ではないかとも思っていますので、完全に推奨される手順で構築された、最小限のwebサーバー環境で実験してみようかと考えています。

###・SQL Server(Windows)側の問題
そもそもに、Windowsサーバー側の問題かなとも思っています。

##憶測
文字コードの変換等は一通り試したかと思いますが、最終的にはこの「コマンドラインからは問題ないのに、Apache経由で実行した場合にだけ発生する」という点がヒントではないかと思っています。Apache側のphpモジュールが正しくないなどの問題ではないか予測しています。

同一の症状に見舞われ、解決に至った経験のある方がいれば、ご教授頂ければ幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hihijiji

2020/06/30 01:32

Nプレフィックスは付けてますか? WHERE hoge = N'ほげほげ' みたいな感じで
saza-e

2020/06/30 02:04

hihijiji さん ご質問ありがとうございます! Nプレフィックスも試しました。 結果としてはうまくいきませんでした。 例えばデータに 1.hoge:ほげほげ 2.hoge:XXXXXX ← ※以前「ほげほげ」をINSERTしたときに文字化けしてしまったレコード という2レコードがある状態で WHERE hoge = N'ほげほげ' をquery()で実行した場合「2」の文字ばけ後の値が取得されてしまいます。 SQL Server側のログ上でも既にWhere句内の「ほげほげ」が文字化けしているため、Linux→Windows間での処理で既に文字化けが発生しているのではないかと思っています。 アドバイスを頂いたのに解決できず申し訳ありません。 もう少し検証してみます。
hihijiji

2020/06/30 02:33

後思いつくのは、OS も Apache もロケールが ja_JP.utf8 になっていることを確認するぐらいかな
saza-e

2020/06/30 04:01

hihijiji さん 無事解決しました!!! ご指摘の通り、Apache側の /etc/sysconfig/httpd の LANG=C の部分を LANG=ja_JP.UTF-8 にする事で解消致しました。 /etc/httpd/conf/のhttpd.conf にばかり気をとられてそもそものApacheのロケールを見落としておりました…。 Linuxのコマンドラインで実行とApache経由で実行で挙動が違う時点で、基本に立ち返ってロケールから見直していれば早急に解決できる内容でした。 重要な解決案をくださりありがとうございました!
guest

回答1

0

自己解決

hihijiji さんのご指摘により無事解決しました。

OS側のロケールとApache側のロケールが一致しておらず
/etc/sysconfig/httpd の LANG=C が有効になっていたため
LANG=ja_JP.UTF-8 にする事で解消しました。

投稿2020/06/30 04:02

saza-e

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問