• ベストアンサー

MySQLでアンダーバーを検索

JDBCを使ってMySQLにアクセスしようと、以下のようなプログラムを書いたのですが、executeQueryでエラーが出てしまいます。 検索したいデータ(100100_0001)に、アンダーバー(_)が入っているので、それが問題であるような気がします。 説明が分かり難くてすいませんが、どなたか助けていただけますでしょうか。 非常に困っております。。。 エラー内容================================================= java.sql.SQLException: General error message from server: "Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (sjis_japanese_ci,COERCIBLE) for operation '='" =========================================================== プログラム=========================================================== String a ; String b : String key ; ResultSet rs; a = "100100" ; b = "0001" ; key = a + "_" + b ; //↑これを key = a + "\_" + b ; とすると、「エスケープ文字が不正です」となってコンパイルが通りませんでした sql = "SELECT * from quote_dtl WHERE qd_id = " + "\'" + key + "\'"; rs_dtl = stmt.executeQuery(sql) ; ===========================================================

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

  • ベストアンサー
  • Bonjin
  • ベストアンサー率43% (418/971)
回答No.1

原因はわかりませんが、mysqlで直接SQLを売った場合はどうなるでしょうか? また、可変的なSQLを発行するならばStatementではなくPreparedStatementを利用する方がいいでしょう。PreparedStatementを使用する場合にはこのようになります。 Connection con; PreparedStatement pstmt; (略) pstmt = con.prepareStatement("SELECT * from quote_dtl WHERE qd_id=?"); pstmt.setString(1, key); rs = pstmt.executeQuery();

fnaka_ph5
質問者

お礼

基本的な問題でした。 Connection時にSJISを設定していたのですが、それを外したところうまく動きました。 変更前 jdbc:mysql:///RFQ?useUnicode=true&characterEncoding=SJIS 変更後 jdbc:mysql:///RFQ?useUnicode=true ですが、PreparedStatementを使ったほうが何かと便利そうなので、使おうと思います。 どうもありがとうございました。

fnaka_ph5
質問者

補足

MySQLで直接打った場合ですが、 select * from quote_dtl WHERE qd_id = 100100_0001 ; と打つと、ERROR 1054 (42S22): Unknown column '100100_0001' in 'where clause' となります。 select * from quote_dtl WHERE qd_id = '100100_0001' ; と打つと、正常にデータがヒットしました。 PreparedStatementを使ったのですが、以下のようなエラーが出てしまいます。 今までのStatementで正常に動いていたところでも以下のエラーが出ます。 何か根本的な問題なのでしょうか。。。 ちなみにコンパイル時には -encoding のオプションはつけてないです。 エラー内容------------------------------------- java.sql.SQLException: General error message from server: "Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (sjis_japanese_ci,COERCIBLE) for operation '='" at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:1997) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1167) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1278) at com.mysql.jdbc.Connection.execSQL(Connection.java:2251) at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1586) at RFQ_select.main(RFQ_select.java:53)

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • juda
  • ベストアンサー率0% (0/6)
回答No.3

質問の件ですがデータベースに接続するときにキャラクターエンコーディングを指定していますか? していないのであれば、 jdbc:mysql://localhost?useUnicode=true&characterEncoding=ujis といった感じに設定してみて下さい。 本当、申し訳ありませんでした。

fnaka_ph5
質問者

お礼

その通りでした。 キャラクターエンコーディングでsjisで指定していました。 ここを外したところ正常に動きました。 どうもありがとうございました。

すると、全ての回答が全文表示されます。
  • juda
  • ベストアンサー率0% (0/6)
回答No.2

見当違いの事を書いてしまっていたら申し訳ないのですが…。 qd_idは文字列ですよね? key = "\"" + a + "_" + b + "\""; ではないのでしょうか??

すると、全ての回答が全文表示されます。

関連するQ&A