• ベストアンサー
  • 困ってます

SQL Serverで文字コードUTF-8

こんにちわ。 いつも拝見しております。 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"; 解決策がありましたらご教示下さい。 よろしくお願い致します。

共感・応援の気持ちを伝えよう!

  • 回答数9
  • 閲覧数17732
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答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 このような形になっております。 どうぞよろしくお願い致します。

関連するQ&A

  • 「[Microsoft][ODBC SQL Server Driver]COUNT フィールドが正しくありません。」えらーについて

    おせわになります、 JavaからMSDEに対してSELECT UPDATE等の処理を行っているのですが。以下のSQLエラーが出てしまいます。 どのような意味なのでしょうか? 雰囲気としてはUPDATE文でおこっているような感じなのですが… ----エラーメッセージ------ [Microsoft][ODBC SQL Server Driver]COUNT フィールドが正しくありません。 よろしくお願いします。

  • SQLserver2000でプライマリーキーの設定でのエラー

    こんばんわ。 現在SQLの勉強をSQLserver2000でしているのですが、 SQL Enterprise Managerを使って、ある列に主キーを定義しようとして、鍵マークをつけて、保存しようとすると 以下のようなエラーがでて設定できません。 テーブル 'xxxxx' - インデックス 'PK_xxxxx' を作成できません。 ODBC エラー : [Microsoft][ODBC SQL Server Driver][SQL Server]インデックス ID 1 で重複したキーが見つかったので、CREATE UNIQUE INDEX は終了しました。もっとも重要な主キーは 'yyyyy ' です。 [Microsoft][ODBC SQL Server Driver][SQL Server]制約を作成できませんでした。以前のエラーを調べてください。 [Microsoft][ODBC SQL Server Driver][SQL Server]ステートメントは終了されました。 初心者なので、このエラーの意味するところが理解できません。 なにが間違っているのでしょうか。 よろしくお願いします。

  • SQL Server2008 の解析

    SQL Server2008でパフォーマンスの悪いSQLなどを調べようと思い、 以下のような説明を参考にしています。 http://msdn.microsoft.com/ja-jp/magazine/cc135978.aspx http://msdn.microsoft.com/ja-jp/library/ms189741.aspx しかし、エラーが出て実行できません。 SQL文から抜粋しますと、以下の様なエラーが発生ます。  ・THEN LEN(CONVERT(nvarchar(max), qt.text)) * 2    →'max' の近くに無効な構文があります。  ・CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt    →'APPLY' の近くに無効な構文があります。  ・SELECT qs.execution_count   FROM sys.dm_exec_query_stats AS qs    →'sys.dm_exec_query_stats' は無効です。 調べても何が悪いのかわからず困っています。 何がいけないのかご教授いただけませんでしょうか。 よろしくお願い致します。

その他の回答 (8)

  • 回答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

  • ODBC 一般ネットワークエラー

    OS:WindowsXP SQLServerOS:WindowsNTServer4.0 SQLServer6.5 お世話になります。 今まで自PCからODBC接続でSQLServerのデータを見ていたのですが、 ある日気付いたら下記エラーが発生し、まったくつながらなく なっていました。 (エラー内容) 接続できませんでした SQL State:’08001’ SQL Server エラー : 11 [Microsoft][ODBCSQL Server Drivers][DBMSSOCN]一般ネットワークエラーです。 ネットワークのマニュアルを調べてください。 接続できませんでした SQL State:’01000’ SQL Server エラー : 10061 ConnectionOpen(connect()) 現在SQLServerは3台あるのですが、全てつなぐことができません。 他PCからはつながるので、自PCに問題があると思われるのですが、 原因がわかりません。 何かヒントでもいいので、どなたかご教授願います。 よろしくお願いします。

  • VBから

    VBからACCESSでリンクをはって使うと "ODBC呼び出しが失敗しました ODBC SQL SERVER DRIVER時間きれになりました" とエラーが出るのですが何か設定上問題が有るのでしょうか 同じテーブルを続けてSELECT(別のSELECT文を)するとですようです

  • ODBC 一般ネットワークエラー

    OS:Windows2000 SQLServerOS:WindowsNTServer4.0 SQLServer6.5 初めてこちらを利用致します。 よろしくお願い致します。 Access(2000)で作られたデータベースに下記エラーが発生し、まったくつながらなくなっていました。 (エラー内容) 接続できませんでした SQL State:’01000’ SQL Server エラー : 10060 [Microsoft][ODBC SQL Server Drivers][TCP/IP Sockets]一般ConnectionOpen(connect()) 接続できませんでした SQL State:’08001’ SQL Server エラー : 11 [Microsoft][ODBCSQL Server Drivers][TCP/IP Sockets]一般的なネットワークエラーです。 ネットワークのマニュアルを調べてください。 現在SQLServerは2台あるのですが、全てつなぐことができません。 インターネットには接続できています。 ポートも調べましたが、問題はありませんでした。 解決方法があれば、ご教授願います。 よろしくお願い致します。

  • ??? SELECT WHEREが上手く出来ない(スペース文字があるフィールドの場合)<==教えて下さい

    恐れ入ります。どうしても解らないので教えて下さい。(ヒントでも) 質問)SELECTの結果が上手くいかない。 サーバー1の商品(スペースを含む20桁)と、サーバー2の商品が一致した場合、両方の内容を連結して表示したいのですが、商品の中のスペースが詰まってしまうのか、化けるのが原因なのか上手くできません。 実行環境)webサーバー : Apache 2.0.58 (winXP sp2)     dbサーバー1 : DB2 UDB・・・ODBC接続     dbサーバー2 : MySQL・・・[MySQL][ODBC 3.51 Driver] [mysqld-5.0.22-community-nt] PHP : PHP Version 5.1.4 実行結果) <商品コード:サーバー1のINPUT側> 1)'12345678901234567890' フル20桁 の場合は SELECT==>0K 2)'A         9' ←中にスペースありの場合SELECT==>WORNIG 画面に'A 9' と表示されて中のスペースが抜けてしまう。 --------------------------------------------------------------- Warning: odbc_exec() [function.odbc-exec]: SQL error: [MySQL][ODBC 3.51 Driver][mysqld-5.0.22-community-nt]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '9 = sqprcd' at line 3, SQL state 37000 in SQLExecDirect in *ちなみに2)は<hrefでリンクしたときのパラメーターが下記のようになってしまい変です。 search.php?prprcd=A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%209 ===============================================================

    • 締切済み
    • PHP
  • SQLサーバー接続について

    DB初心者です。 ODBCからSQLサーバーへのアクセスを設定したく、奮闘しておりますが うまくいかず困っております。 先方から支給されたのは、 DB名、ID、パスワード、ホスト名、ポート番号、MySQLのバージョン5.0.90で、 その通り設定したつもりが、以下のようなエラーが出てソース作成できません。 --- 接続できませんでした。: SQLState: '01000' SQL Server エラー: 11001 [Microsoft][ODBC SQL Server Driver][TCP/IP Sockets]ConnectionOpen(Connect()). 接続できませんでした。: SQLState: '08001' SQL Server エラー: 6 [Microsoft][ODBC SQL Server Driver][TCP/IPSockets]指定された SQL Server が見つかりません。 --- エラー番号で検索してみても原因がわからず・・・ 詳しい方いらっしゃいましたらお願いいたしますm(__)m

  • MySQL4.1 文字コードについて

    MySQL4.1を導入したのですが一部文字が入力できないときがあります。 MySQL4.0の時は不具合はおきませんでした。 MySQLのキャラクタセットはすべてsjisに設定しました。 character_set_client sjis character_set_connection sjis character_set_database sjis character_set_results sjis character_set_server sjis character_set_system utf8 MySQL・phpでサイトを構築しているのですが 入力フォームで文章が「ソ」「表」で終わると、登録に失敗します。 shift-jisの特殊文字ですので「ソ\」「表\」のようになり、SQL文のシングルコーテーションが文字列(\')と認識されると思うので下記置き換えで大丈夫かと思いましたが、また失敗しました。 $text = str_replace("\\","\\\\",$text); $text = str_replace("'","\'",$text); MySQL4.1はホントに難しいです… お分かりになる方いましたらよろしくお願いします。

    • ベストアンサー
    • MySQL
  • SQLサーバーのテーブルに対してアクセスで更新クエリを行ないたい

    こんばんは。 ・vista ・アクセス2003 ・SQL Server 2005 です。 SQL ServerからテーブルをMDBへリンクしているのですが そのテーブルに対し、アクセス側で更新クエリを実行しようとすると 実行時エラー '3157': ODBC--リンク テーブル'テーブル名'での更新に失敗しました。 [Microsoft][ODBC SQL Server Driver]時間切れになりました。(#0) と言うエラーになり、更新クエリができません。 どうすればアクセスでSQLサーバーのテーブルに対して更新クエリを行えるのでしょうか? よろしくお願いします。

  • ODBC SQL ServerでSQLを発行したいのですが・・・

    ODBC SQL ServerでSQLを発行したいのですが・・・ IDがそのまま表示されてしまっていたので、再度登録しなおしました>< ・実行SQL DECLARE @DATE DATETIME DECLARE @STARTDATE DATETIME SET @DATE = GETDATE() SET @STARTDATE = DATEADD(DAY,-7,@DATE) SELECT * FROM teble WHERE 配達開始日 >= @DATE AND 配達開始日 <= @STARTDATE 上記のようなSQLを発行しデータを取得したいのですが、実行結果に表示がされません。 どうしていいかわからず困っています。 頭のDECLARE文しか動いていないのではないんだろうかと思っています。 実行ツールはCommon SQL Envieron mentを使用しています。

  • ネットワークドライブ経由でODBC

    WindowsXP、Apache2/2.0.55、PHP/5.0.5の環境で、ODBCを介してMicrosoft Access(*.mdb)にアクセスするphpを作ろうと思ってます。 データソースがローカルにあるときは上手くいくのですが、ネットワークドライブに割り当てられた共有にあるとウォーニングが出て、データベースに接続できません。 どうすれば接続できるでしょうか?参考にしたURLはhttp://www.phpfreaks.com/print.php?cmd=tutorial&tut_id=61です。 出たウォーニングは Warning: odbc_connect() [function.odbc-connect]: SQL error: [Microsoft][ODBC Microsoft Access Driver] パス '(不明)' は正しくありません。パス名に間違いがないことと、ファイルが置かれたサーバーに接続していることを確認してください。, SQL state S1009 in SQLConnect in C:\Program Files\Apache Group\Apache2\htdocs\odbc\odbc.php on line 2 Could Not Connect to ODBC Database! です。

  • 以下のSQL文を実行したのですが、MySQL server has g

    以下のSQL文を実行したのですが、MySQL server has gone awayというエラーが発生してしまいます。 さまざまなサイトを確認したのですが間違いが分からないため質問をさせていただきました。 よろしくお願いします。 SELECT * FROM t1 WHERE f1 = ANY (SELECT f1 FROM t2 WHERE group = '1'); (SELECT f1 FROM t2 WHERE group = '1')では30件程度が該当し、t1は5万行前後です。 MySQL クライアントのバージョン: 5.1.22-rc