

こんにちわ。
いつも拝見しております。
PHPでODBC接続によるSQL Serverへの問い合わせを行う部分でエラーが出て困っております。
odbc_exec()[function.odbc-exec]:SQL error:[Microsoft][ODBC SQL Server Driver][SQL Server][文字化けしたSQL文]SQL state 37000 in SQLExecDirect in C://.......
SJISの時は問題なかったのですがcharsetや保存形式をUTF-8に統一してから出るようになりました。
SQL文は下記のように日本語となっております。
$str = "select 担務,部課 from group by id";
解決策がありましたらご教示下さい。
よろしくお願い致します。
No.1ベストアンサー
- 回答日時:
>SJISの時は問題なかったのですがcharsetや保存形式をUTF-8に統一してから出るようになりました。
SQL Serverの文字コードはUTF-8になっているということでしょうか。
また、PHPのマルチバイト文字関連の設定を詳しく教えてください。
この回答への補足
UmJammerさん
ありがとうございます。
SQL Serverの文字コードは恥ずかしながら確認方法が分かりませんでしたので調べてみます。
文字関連の設定を記載させて頂きます。
【php】
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
と記述してUTF-8で保存しました。
【php.ini】
magic_quotes_gpc = Off
extension_dir = "C:/php/ext"
extension=php_mbstring.dll
extension=php_mssql.dll
extension=php_pdo.dll
extension=php_pdo_mssql.dll
extension=php_pdo_odbc.dll
[ODBC]
odbc.allow_persistent = On
odbc.check_persistent = On
odbc.max_persistent = -1
odbc.max_links = -1
odbc.defaultlrl = 4096
odbc.defaultbinmode = 1
[mbstring]
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.http_input = auto
mbstring.http_output = UTF-8
mbstring.encoding_translation = On
mbstring.detect_order = auto
mbstring.substitute_character = none
このような形になっております。
どうぞよろしくお願い致します。
No.9
- 回答日時:
DBのデータはSJIS、内部エンコードおよび出力はUTF-8なので、取得したデータを正しく表示するにはやはり文字コードを変換しなければなりません。
というような意味で取り扱いには注意しましょうと書いたのですが、回りくどすぎましたね。
先ほどの回答の$clm1をUTF-8に変換して出力してみてください。
echo mb_convert_encoding($com1, "UTF-8", "SJIS");
これでPHPの設定に変更がなければこれで正しく表示されるはずです。
気になったのですが、
>DBのSJISの問題はまだ解決していないのですが
これはつまるところDBもUnicode(UTF-8)に変更するということでしょうか。であればそちらを優先しなくてはダメですよ。
というよりPHPのコーディングなどしてる場合ではないです。
というのも、DBがUnicode(UTF-8)になれば、文字コードの変換処理は不要になりますから。
まぁちょっとした勉強にはなったかもしれませんが。。
UmJammerさま
ありがとうございます。
うまく表示されました!
DBもUnicode(UTF-8)に変更しない予定のようですので今はPHP側で変換処理をしていこうと思います。
仰るとおりとてもいい勉強にもなりました!
数日に渡りご教示頂きましてありがとうございました。
感謝しております。
No.8
- 回答日時:
ANo.1です。
たびたびすいません。また訂正です。。
×$clm1 = odbc_result($r, mb_convert_encoding("0120担当者", "SJIS", "UF-8");
○$clm1 = odbc_result($r, mb_convert_encoding("0120担当者", "SJIS", "UTF-8"));
この回答への補足
UmJammerさん
ご教示ありがとうございます。
odbc_result($r, mb_convert_encoding("0120担当者", "SJIS", "UTF-8"));
でNot Fieldのエラーは解消しましたが文字化けしてしまっているようです。
「~??~??」みたいな感じです。
DBのSJISの問題はまだ解決していないのですがこちらを解決しなければこの文字化けは解消しないのでしょうか?
度々、すみませんがよろしくお願い致します。
ご教示のおかげでここまで来ることができました。
ありがとうございます。
No.7
- 回答日時:
ANo.1です。
>mb_detect_encoding($clm1)
>としてみると「ASCII」と表示が出ました。
ここは一旦放っておいても平気です。
問題は、
>$clm1 = odbc_result($r,"0120担当者");
この「0120担当者」は内部エンコーディング(UTF-8)で記述されているので、SJISのDBのフィールド名とは合致しないのではないかと思うのですが、それともエラーは解決したのでしょうか。
未だエラーが出るようでしたら、ここを
$clm1 = odbc_result($r, mb_convert_encoding("0120担当者", "SJIS", "UTF-8");
と書きなおして実行してみてください。
#これならはじめの方に質問者様が書いたようにフィールド名ごとに文字コード変換をして変数に格納しておく方が効率的でしたね。。
#もしくはすべてAS句で半角英数の別名をつけた方がまだ楽かもしれないですね。
ところで、これで無事にDBからデータが取得できてもその値もやはりSJISなのでその取扱いには注意してください。
No.6
- 回答日時:
ANo.1です。
補足説明ありがとうございました。
SQLが間違ってるのかと思っていたのですが、odbc_resultでエラーなので違いますね、こちらこそ申し訳ありませんでした。
で、ここからはコードが省略されているので予想ですが、
odbc_resultで「0120担当者」を取得するときにフィールド名で取得しに行っていると思うのですが、これがSJISでないということはないですか?
DBがSJISだとすると、フィールド名もSJISなので内部エンコーディング(UTF-8)で「0120担当者」と書いても通らないはずです。
この回答への補足
UmJammerさん
おはようございます。
仰るとおり
$clm1 = odbc_result($r,"0120担当者");
で取得しております。
mb_detect_encoding($clm1)
としてみると「ASCII」と表示が出ました。
どうぞ宜しくお願い致します。
No.5
- 回答日時:
ANo.1です。
たびたびすいません。訂正です。
>「担当者」というフィールドではなかったのですか?
ここ、「担当者」でなくて「担務」です。
この回答への補足
UmJammerさん
大変失礼致しました。
先ほど指示があり多少、項目が変更となってしまいました。
$str = "select [0120担当者],個数 AS Count from datatbl group by id";
こちらが確定版です。
エラーメッセージは抜粋ではないです。
画面にエラーだけが表示されているわけではなくCountについてはHTML表示されており先ほどのエラーメッセージが上に表示されている状態です。
SQL文のフィールドは確かに存在する事を確認しております。
わかりづらく申しわけございませんでした。
No.4
- 回答日時:
>[function.odbc-result]:Fied 0120担当者 not found in
これって、「0120担当者」というフィールドがないってメッセージですかね。「担当者」というフィールドではなかったのですか?
エラーメッセージは抜粋ですか?であれば全部載せた方が回答が得られやすいと思います。
No.3
- 回答日時:
ANo.1です。
>おっしゃっている内容は
>
>$clm1 = mb_convert_encoding("担務",'SJIS')
>$clm2 = mb_convert_encoding("部課",'SJIS')
>
>$str = "select $clm1,$clm2 from group by id";
>
>上記のようにするといった認識で宜しいでしょうか?
問題ないと思いますが、SQLを投げるだけだったら以下でもよいかと思います。
$str = "select 担務,部課 from group by id";
$str = mb_convert_encoding($str, "SJIS", "UTF-8");
これでSQLが通るようになるかもしれませんが、やはりDBの文字コードもUnicode(UTF-8)にした方がなにかと都合がよいです。
あとは、フィールド名などにマルチバイト文字を使うのはあまりよくないような。。
この回答への補足
UmJammerさん
どうもありがとうございます。
本日、やっと試すことができたのでお返事が遅くなりました。
ご教示頂いた記述でSQLは通りました。
しかしresultの部分で
***************************************************
[function.odbc-result]:Fied 0120担当者 not found in
***************************************************
と出てしまいました。
mb_detect_encodingをprintするとASCIIとなっていましたがこれはどの様にコーディングするといいのでしょうか?
同じようにmb_convert_encodingを使ってみましたが改善されませんでした。
度々の質問で恐縮ですがよろしくお願いします。
ソースは以下のようになっております。
-----------------------------------------------------
$db = odbc_connect("web","test","test");
$str = "select [0120担当者],部課 from group by id";
$str = mb_convert_encoding($str, "SJIS", "UTF-8");
$r = odbc_exec($db,$str);
while(odbc_fetch_row($r)){
$clm1 = odbc_result($r,"");
~HTMLで<?= $clm1 ?>を出力~
}
-----------------------------------------------------
No.2
- 回答日時:
ANo.1です。
補足説明ありがとうございます。
PHPの方は完全にUTF-8に対応していますね。
もしかするとSQL Serverの文字コードがSJISなのかもしれません。
SQL文の文字コードを、発行される前にSJISに変換してみるとどうでしょうか。
この回答への補足
UmJammerさん
こちらこそご教示頂きありがとうございます。
おっしゃっている内容は
$clm1 = mb_convert_encoding("担務",'SJIS')
$clm2 = mb_convert_encoding("部課",'SJIS')
$str = "select $clm1,$clm2 from group by id";
上記のようにするといった認識で宜しいでしょうか?
知識不足の為、お手数をおかけしますがよろしくお願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- PHP PostgreSQLからCSV形式でエクスポートする際にカラム内の改行をとる方法 1 2023/02/22 10:05
- MySQL テーブル作成です。どこかのスペルが間違っているか記号など スペースかな? 1 2022/10/01 05:08
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- MySQL SQLです。下記の問合せを行うクエリを、PhpMyAdminで作成して実行せよ。 「昨年の各月の総降 1 2023/07/01 00:32
- SQL Server SQL ServerでDBを構築。これは開発? 4 2022/05/28 14:10
- Oracle SQLについて教えて下さい。 主キーを持ったカラムを主キーの機能を持たせたまま カンマ区切りで文字列 1 2023/03/27 22:47
- Access(アクセス) アクセス 有効なフィールド名、または式として認識できませんのエラー 3 2022/08/19 11:53
- Oracle sqlで質問です。 aテーブルとbテーブルがあり、下記のsqlで取得したidとnameに一致しないレ 1 2022/04/20 20:34
- Excel(エクセル) EXCELの「接続」のSQLのコマンド文字列にて、セルから任意の数値を利用したい 2 2023/03/09 16:43
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SQL Serverで文字コードUTF-8
-
小さいひらがな(っ、ょ、ぃ、ゃ...
-
日本語混じりの文字列の語数制限
-
mysql登録時の文字化け
-
文字コードの検出が正しいかを...
-
htmlはSJIS PHPはEUC mb_conv...
-
メール送信プログラムで特定文...
-
【PHP】mb_convert_encoding...
-
phpのメールフォームの完了画面...
-
postの文字化け防止について
-
文字コード変換
-
mail()で送信したメールのタイ...
-
文字コードを変換したURLを作成...
-
VBAのコマンドボタンの文字列の...
-
ソースコードの1行が長いとき...
-
エスケープ文字の復帰(¥r)と...
-
テキストボックス行の桁数を制...
-
カンマの含まれる文字列の数値...
-
Excel関数「COUNTIF」で”文字”...
-
文字の入力で横バー上段、中断...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
文字化け変換方法
-
PHPでのメール差出人名について
-
PostgreSQLからCSV形式でエクス...
-
PHP cURLでPOSTした値が文字化...
-
SJISからUTFに変換して...
-
SJIS→UTF-8変換後の文字化けに...
-
【PHP】mb_convert_encoding...
-
mb_regex_encodingでエンコード...
-
mb_send_mailの2重投稿を防止し...
-
mb_convert_encoding で 一部の...
-
PHPmailerでの添付ファイルの文...
-
includeファイルの文字コードに...
-
switch文の関数化
-
SQL Serverで文字コードUTF-8
-
phpのメールフォームの完了画面...
-
RSSを取得すると文字化けする。
-
Access VBA wiht文での実行時エ...
-
PHPでメール受信時にVISTAから...
-
mail()で送信したメールのタイ...
-
mb_ereg_replaceに関して
おすすめ情報