こんにちわ。
いつも拝見しております。
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も見ています
-
とっておきの「夜食」教えて下さい
真夜中に小腹がすいたときにこっそり作るメニュー、こっそり家を抜け出して食べに行くお店… 人には言えない、けど自慢したい、そんなあなたの「とっておきの夜食」を教えて下さい。
-
スマホに会話を聞かれているな!?と思ったことありますか?
スマートフォンで検索はしてないのに、友達と話していた製品の広告が直後に出てきたりすることってありませんか? こんな感じでスマホに会話を聞かれているかも!?と思ったエピソードってありますか?
-
「覚え間違い」を教えてください!
私はかなり長いこと「大団円」ということばを、たくさんの団員が祝ってくれるイメージで「大円団」だと間違えて覚えていました。
-
おすすめのモーニング・朝食メニューを教えて!
コメダ珈琲店のモーニング ロイヤルホストのモーニング 牛丼チェーン店の朝食などなど、おいしいモーニング・朝食メニューがたくさんありますよね。
-
14歳の自分に衝撃の事実を告げてください
タイムマシンで14歳の自分のところに現れた未来のあなた。 衝撃的な事実を告げて自分に驚かせるとしたら何を告げますか?
-
処理件数を非表示にしたい
SQL Server
-
ファイルの文字コードをUTF-8に変換
その他(プログラミング・Web制作)
-
PHPからMSSQLへの接続結果の文字化け
PHP
-
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~12/2】 国民的アニメ『サザエさん』が打ち切りになった理由を教えてください
- ・ちょっと先の未来クイズ第5問
- ・【お題】ヒーローの謝罪会見
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PHPmailerでの添付ファイルの文...
-
PHPでのメール差出人名について
-
PHPスクリプトでエンコードエラー
-
「あ」→「82A0」のようにshift-...
-
postの文字化け防止について
-
【PHP】mb_convert_encoding...
-
mb_convert_encoding で 一部の...
-
曜日を日本語表示にする方法は?
-
Net_POP3 メール一覧のソート
-
includeファイルの文字コードに...
-
メールフォームが部分的に文字...
-
VBAのコマンドボタンの文字列の...
-
エスケープ文字の復帰(¥r)と...
-
ソースコードの1行が長いとき...
-
メッセージボックスで1025文字...
-
エクセルのCOUNTIFが正しくカウ...
-
改行を読み飛ばす
-
文字の入力で横バー上段、中断...
-
Replace関数は文字数の制限ある...
-
VBA ASC関数で変換できない文...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
文字化け変換方法
-
UTF8メールがLotus Notesで文字...
-
SJISで取得した半角カナをUTF-8...
-
SQL Serverで文字コードUTF-8
-
セッションが文字化け、エンコ...
-
mail()で送信したメールのタイ...
-
PHP+Postgres 「髙」が文字化け
-
Access VBA wiht文での実行時エ...
-
php自動返信メール本文の一部の...
-
mb_convert_encoding で 一部の...
-
SJIS→UTF-8変換後の文字化けに...
-
携帯向けフォームの文字化け
-
sjisの文字化けとその対処方法...
-
送信したメールのタイトルが無...
-
PHP cURLでPOSTした値が文字化...
-
全角の”’¥を半角に変換したい
-
UTF-8サイトを取得しSJISに
-
文字コードを変換したURLを作成...
-
文字コードの検出が正しいかを...
-
正規表現で数値から始まりYを1...
おすすめ情報