• ベストアンサー

StatementクラスのexecuteQueryメソッドを使用したSQLの発行について

StatementクラスのexecuteQueryメソッドを使用したSQLの発行について教えてください。 JavaでMySQLのデータベースからデータを取得するため、 executeQueryメソッドを使用してSQLの発行を行ったのですが、select文が正常に実行されずに困っています。(where句の条件が引っかからずに困っています。) 【前提】 ・カラム「name」の値に「name(nameという文字)」が入っている状態。 ・INT型、CHAR型で定義されたカラムの値は取得できる ・VARCHAR型で定義された、カラムの値が取得できない 【状況】  VARCHAR型で定義された、カラムの値が取得できない場合というのが、java側で、  stmt.executeQuery("SELECT * from customer where name='name'") というようにSQL文を発行した場合です。  MySQLのコマンドプロンプトからダイレクトに投げた場合や、  またDBViewerを使用した場合は、Where句の「name='name'」で引っかかったデータが正常に返ってくるのですが、  Javaから発行した場合のみ「VARCHAR型で定義されているカラムの値が取れない」という状況なのです。  (考えられることとしては、SQL発行時「SELECT * from customer where name='name'」 の 「'name'」が、別の何かに変わっているのかな?(文字コードなどが関係しているのか?)など考えているのですが、解決できず困っております。)   一体どこに問題があるのでしょうか?   (CHAR型、INT型のデータは正常にJava側で読めるのに、VARCHAR型の値をwhere句にした場合に限って、正常にデータ抽出できない、という点が腑に落ちないのですが・・・ SQLエラーを吐く訳ではなく、抽出条件が成立していない形なのです)   【実行環境】 ・Windows XP Pro ・eclipse3.4(all in one eclipse) ・Java1.6 ・TomCat6.0 ・MySQL5.0 (文字コード:UTF-8)

  • Java
  • 回答数2
  • ありがとう数3

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

  • ベストアンサー
回答No.2

質問の内容だけですと問題箇所の特定は困難なので、原因を調べるためにはMySQLサーバが出力するログファイルの確認が必要だと思います。 MySQLサーバには要求されたSQLをログファイルに出力する機能があるはずなので、その機能を有効にすればどのようなSQL文がMySQLへ届いているのかが分かります。それを確認することで問題箇所を絞り込めるのではないでしょうか。

Guno-this
質問者

お礼

ありがとうございます。 >MySQLサーバが出力するログファイルの確認が必要だと思います。 そのようなものがあるのですね(驚) 問題箇所の絞込んで、 また確認していこうと思います。 どうもありがとうございます。 なんだか解決に繋がりそうな気がしてきました。

Guno-this
質問者

補足

この質問についてですが お知恵を貸していただいてすみません^^; あれから、いろいろ試していったのですが、 「eclipseを終了させた後、eclipse機能の“リフレッシュ(ショートカットキーF5)”を使用したところ、後に問題なく動作するようになりました。」 MySQLのログの確認方法については まだわかっていませんので、また調べてみたいと思います。 どうも、ありがとうございました。

その他の回答 (1)

  • x_jouet_x
  • ベストアンサー率68% (162/236)
回答No.1

私のところもほぼ同じ環境で確認しましたが、VARCHAR型の値をwhere句に使用しても問題なく抽出できました。 where句に2バイト文字(全角など)を使用していれば文字コードも関係してくる可能性もありますが、そういう問題でもなさそうですね。 試しにPreparedStatementでSQLを発行してみてはいかがでしょう? 結果は同じかもしれませんが…。 後は考えられることはJDBCのバージョンでしょうか…。

Guno-this
質問者

お礼

ありがとうございます。 私の方も別の環境で試してみたところ、 問題なく動いたのですが、あるプロジェクトに限ってそのような状態です。 ちょっと色々とためしてみます(汗) どうもです。

Guno-this
質問者

補足

この質問についてですが お知恵を貸していただいてすみません^^; あれから、いろいろ試していったのですが、 「eclipseを終了させた後、eclipse機能の“リフレッシュ(ショートカットキーF5)”を使用したところ、後に問題なく動作するようになりました。」 「eclipse内容とワークスペース内容の同期が取れてなかった」だけなのかもしれませんが・・・ んー なんだったんですかね(--; 現状は問題なく動作している状況です。(苦笑) どうも、ありがとうございました。

関連するQ&A

  • 一度のSQL発行で結果を得るにはどのようなSQLにすれば良いでしょうか

    一度のSQL発行で結果を得るにはどのようなSQLにすれば良いでしょうか? データベースはOracleです。 二つの履歴テーブルがあり、それぞれ主キーは「連番」です。 連番が最も大きい値の社員番号と社員名を取得しようとしています。 (他にもカラムはありますが質問では省略しています。) 連番は別に管理テーブルがあり、そちらから採番しているので 二つのテーブルで連番が重複することはありません。 【RIREKI_TBL_A】 連番 NUMBER(10) 社員番号 VARCHAR(7) 社員名 NVARCHAR(20) 【RIREKI_TBL_B】 連番 NUMBER(10) 社員番号 VARCHAR(7) 社員名 NVARCHAR(20)

  • PL/SQLの動的SQLで複数の項目を取得する方法教えて下さい。

    動的SQLで複数の項目を取得する方法で 悩んでいます。 下記の例だと、1項目しか取れません。 何か他のやり方でもいいので、複数の項目を 取得する方法を教えていただきたいです。 ********************************************* declare sql_stmt varchar2(200); wk_grp varchar2(5); wk_name varchar2(30); type cursor_type is ref cursor; cur_name cursor_type; begin wk_grp := '1u'; open cur_name for 'select 名前 from 社員表 where 所属グループ = :v1' using wk_grp; loop fetch cur_name into wk_name; exit when cur_name%notfound; dbms_output.put_line(wk_name); end loop; close cur_name; end; ********************************************* 下記のようなDBMS_SQLパッケージ?? を利用した方法がいいんでしょうかね。。。。 DBMS_SQL.COLUMN_VALUE(SQL,1,WK_NAME) DBMS_SQL.COLUMN_VALUE(SQL,2,WK_NO) よくわかってないので、宜しくお願いします。

  • Oracle SQLの、where句内の条件文について教えてください。

    Oracle SQLの、where句内の条件文について教えてください。 下記SQLの(1)と(2)の記述文を教えてください。 (1)例:owner = sys,admin ownerがsysまたは、adminを抽出 (2)例:column_name = '*aaa*' column_nameに「aaa」が含まれているデータ SELECT owner, table_name,column_name FROM all_tab_columns WHERE (1)(Ownerを複数指定)   and (2)(column_nameに、●●が含まれるデータ)

  • jspとsqlの連結したページ

    <%@ page import="java.sql.*" %> <% //パラメータの取得 String keyword = request.getParameter("keyword"); //ドライバーのロード Class.forName("com.mysql.jdbc.Driver"); //DBに接続 String url = "jdbc:mysql://localhost/java4z?useUnicode=true&characterEncoding=MS932"; String user = "root"; String pass = ""; Connection con = DriverManager.getConnection(url,user,pass); //SQL発行先ほど指定したConnection con を利用 Statement stmt = con.createStatement(); String sql = "select * from shop where name like '%" + keyword + "%' or author like '%" + keyword + "%' ; ResultSet rs = stmt.executeQuery(sql);%> jspとmysqlの連動したページを作っているのですが select count(*) from テーブル名;を使い 件数を表示(XX件目など)させたいのです さらに値段からXX円以上からXX円以下なども データから検索し表示させたいのですが String sql = "select * from shop where name like '%" + keyword + "%' or author like '%" + keyword + "%' ;の部分をどのように記述すればよいか 解かりません! どなたかお願いします☆()

    • ベストアンサー
    • MySQL
  • SQL文作成のお願い

    前提として下記のようなテーブルがあります。 テーブル名:test フィールド: 1)id: varchar, not null 2)name: varchar 3)date: timestamp with time zone, not null このテーブルに下記のようなレコードがあります。 '00001', 'A', '2005-01-01 00:00:00' '00001', 'B', '2005-07-01 00:00:00' '00001', 'C', '2005-11-01 00:00:00' '00002', 'X', '2005-01-20 00:00:00' '00002', 'Y', '2005-07-20 00:00:00' '00002', 'Z', '2005-11-20 00:00:00' ■今やりたいこと このテーブルからidごとにdateフィールド値が最近のレコードを取得したい。 ■やってみたこと 下記SQLを発行しました。 >select id, max(date) from test group by id order by id 結果==> 00001 2005-11-01 00:00:00 00002 2005-11-20 00:00:00 実際はnameフィールドの値も取得したいのですが、group by句を使うとフィールド指定ができませんでした。 ■だめだったSQL select id, name, max(date) from test group by id order by id どのようにSQLを書けばよろしいでしょうか?

  • 【PL/SQL】SQL文が長すぎてSELECTできない

    oracle9iのpl/sqlでSELECT文を発行し 取得したカーソルを返す処理をしています。 where句が動的になる為 実行するSQL文が長くなり ORA-06502: PL/SQL: 数値または値のエラー: 文字列バッファが小さすぎます。が発生しました のエラーが発生します。 そこで、SQL文の部分をCLOB型にしたり SQL文を「||」でつなげたり してみましたが、どちらもエラーになりました。 長すぎるSQL文を実行するには どうしたらよいでしょうか? 以下ソースです。(左側の数字は行数です) ----------------------------------- 1 PROCEDURE テスト(O_カーソル IN OUT 情報カーソル) IS 2 TYPE curType IS REF CURSOR; 3 tmpCur curType; 4 sqlStr VARCHAR2(32767); 5 6 7 BEGIN 8 9 sqlStr := 'SELECT ' 10 sqlStr := sqlStr || 'A,B ' 11 sqlStr := sqlStr || 'FROM' <<省略>> 12 OPEN tmpCur FOR sqlStr ←エラー発生 13 O_カーソル := tmpCur; --取得したカーソルを返す 14 END テスト; ----------------------------------- (1)SQL文をCLOB型にしてみる:コンパイルエラー 4 sqlStr CLOB (2)SQL文を「||」でつなげてみる:文字列バッファが小さすぎますでエラー Dim sqlStr1 VARCHAR2(32767); Dim sqlStr2 VARCHAR2(32767); Dim sqlStr3 VARCHAR2(32767); <<省略>> 12 OPEN tmpCur FOR (sqlStr1      || sqlStr2      || sqlStr3 <<省略>> )

  • MySQLで検索されたフィールド

    いつもお世話になっております。 MySQLで以下のようなSQL文を発行しています。 select * from table where (INSTR(`table`.`name`,'キーワード')<>0 OR INSTR(`table`.`keyword`,'キーワード')<>0) nameカラムとkeywordカラムのどちらのカラムから検索されたのか知りたいのですが どのようにしたらよろしいでしょうか。 (「キーワード」文字列がどちらのカラムに入っているのか知りたいです。) [環境]  MySQL:5.5.16 よろしくご教示お願いいたします。

    • ベストアンサー
    • MySQL
  • SQLの書き方

    わからないので質問をさせて頂きます。 テーブルAに、money、rank、name、IDと言うカラムがあります。 テーブルBに、IDとpointと言うカラム名があります。 テーブルAのIDを指定し、テーブルBに同じIDが存在する場合 テーブルAとBの値を取得するSQLを書いています。 Select テーブルA.money,テーブルA.rank テーブルA.name,テーブルA.ID,テーブルB.point FROM テーブルA,テーブルB Where テーブルA.ID = '5'; このように書くとmoney,rank,name、IDは重複して表示がされ pointに関してはすべてのpointが表示されてしまいます…。 重複するのでdistinctを使ったのですが うまくいかず…。 SQL初心者ですが、よろしければ教えてください。

    • ベストアンサー
    • MySQL
  • SQLのBetween句

    SQL初心者です。 どなたかヒントでもよいのでご教授お願いします。 分からない箇所は以下の2つです。(SQLは下方に示しています) ・where句のbetweenの箇所にカラム指定箇所にTO_CHAR(SYSDATE -2, 'YYYYMMDD') を入れた時、何を評価しているのか? ・where句のbetweenの条件部分のカラム名に(+)をつけた場合何を意味しているのか? この2つがどうしても分かりません。 このSQLについて知識お持ちに方よろしくお願いします。 環境は次の通りです。 ------------------------ ■環境 ・OracleDatabase10.2 ■テーブル構成 テーブルは以下の2つです。 ・sample1 ・sample2 sample1テーブルに以下のカラムがあります。 ・test1 sample2テーブルに以下のカラムがあります。 ・test2 ------------------------ ■SQL SELECT * FROM sample1 s1, sample2 s2 WHERE TO_CHAR(SYSDATE -2, 'YYYYMMDD') BETWEEN s1.STAYMD(+) AND s2.(+)

  • SQL(oracle)でご助言いただきたく。

    oracle sql developer(Version 1.5.1 )を使用してsqlを叩いてもエラーが出てくるので ご助言いただきたく思います。 update table set comment = '新規' where code = '111'; 上記のSQL文を実行すると、ora-01747のエラーが出ます。 commentという名前のカラムですが、 ここを別のカラムmailにして実行するとうまくいきます。 カラムの型は以下の通りです。 comment : varchar2(500 BYTE) mail : varchar2(128 BYTE) 唯一気がかりなのは、通常ならば update,set,where だけが濃い青色で表示されるのですが、 commentもなぜか濃い青色で表示されます。 (mailは濃い青色になりません。) ご助言の程、宜しくお願い致します。