mysql:5981
From: "Cold Winter" <"Cold Winter" <coldwinter@xxxxxxxxxx>>
Date: Thu, 22 Aug 2002 19:37:41 +0900
Subject: [mysql 05981] Re: JDBC での INSERT と UPDATE で日本語が ? に化けてしまいます
> 実は「\」と「'」を入力し登録すると、MySQLにおいて更新エラーが発生していま > す。 > あたりまえのような話で恐縮なのですが、 > SQL文の記述などで逃げることはできないのでしょうか? …データの文字列フィールドに与える値として円マーク(\)やシングルクォーテー ション(')が必要だということなんですよね…, もしそうなら,PreparedStatement.setString() で設定する文字列の文字をそれぞれ 精査して,「\ → \\」 / 「' → \'」などと変換するしかないかもしれません。 もしそうでないのなら,PreparedStatement に与える SQL 文の内容を↓みたいに シングルクォーテーションで括っておくとよいかもしれません。 ----------------------------------- strMojiretsu1 = "いろいろ\いろいろ'いろいろ"; intKazu2 = 0; intKazu3 = 0; try { Connection cont = DriverManager.getConnection(…); PreparedStatement prpStmt = cont.prepareStatement("insert into table1 values('?', ?, ?)"); prpStmt.setString(1, strMojiretsu1); prpStmt.setInt(2, intKazu2); prpStmt.setInt(3, intKazu3); prpStmt.execute(); } catch (Exception ee) { /* エラー処理 */ } ----------------------------------- ----- Original Message ----- From: "福元 政明" <fukumoto@xxxxxxxxxx> To: <ml@xxxxxxxxxx> Sent: Thursday, August 22, 2002 7:08 PM Subject: [mysql 05980] Re: JDBC での INSERT と UPDATE で日本語が ? に化けてしまいます > 福元です。お世話になります。 > 下記のように、うまくいきました、と書きましたが > 実は「\」と「'」を入力し登録すると、MySQLにおいて更新エラーが発生していま > す。 > あたりまえのような話で恐縮なのですが、 > SQL文の記述などで逃げることはできないのでしょうか? > なみに MS-ACCESS であれば「\」ではエラーとなりませんでした。 > 以上、よろしくお願いいたします。 > > > -----Original Message----- > > From: 福元 政明 [SMTP:fukumoto@xxxxxxxxxx] > > Sent: Thursday, August 22, 2002 4:57 PM > > To: ml@xxxxxxxxxx > > Subject: [mysql 05979] Re: JDBC での INSERT と UPDATE で日本語 > > が ? に化けてしまいます > > > > Cold Winter様、村上様、ありがとうございました。 > > とりあえず「ー」の問題も解決しました。 > > ポイントは接続文字列中の &useUnicode=true&characterEncoding=Shift_JIS でし > > た。 > > なぜか Windows では、SJIS と Shift_JIS は異なるもののような気がします。 > > TOMCATの使用かもしれませんが..... > > ところで、PreparedStatemennte を使用しても、executeQuery で > > sta = con.prepareStatement(new String(p1.getBytes("8859_1"),"Shift_JIS")); > > としてやらないとうまく日本語を渡せないようです。 > > とりあえず、MS-ACCESSでもMSDEでもMySQLでもうまくいきました。 > > ありがとうございました。 > > > > > -----Original Message----- > > > From: Cold Winter [SMTP:coldwinter@xxxxxxxxxx] > > > Sent: Thursday, August 22, 2002 4:09 PM > > > To: ml@xxxxxxxxxx > > > Subject: [mysql 05977] Re: JDBC での INSERT と UPDATE で日本語が > > > ? に化けてしまいます > > > > > > > ところで質問ですが、なぜ PreparedStatement でうまくいったのか? > > > > 私の頭ではピントきません。 > > > > よろしければご指導の程お願い致します。 > > > > > > …PostgreSQL のものなのですが,JDBC ドライバのソースを見ると, > > > PreparedStatement.setString() の処理の中で↓のように '\' の処理 > > > をして,文字化けを起さないようにしているようですね。 > > > > > > −−−−−−−−−−−−−−−−−−−−−−−−− > > > public void setString(int parameterIndex, String x) throws SQLException > > > { > > > // if the passed string is null, then set this column to null > > > if (x == null) > > > setNull(parameterIndex, Types.OTHER); > > > else > > > { > > > // use the shared buffer object. Should never clash but this makes > > > // us thread safe! > > > synchronized (sbuf) > > > { > > > sbuf.setLength(0); > > > int i; > > > > > > sbuf.append('\''); > > > for (i = 0 ; i < x.length() ; ++i) > > > { > > > char c = x.charAt(i); > > > if (c == '\\' || c == '\'') > > > sbuf.append((char)'\\'); > > > sbuf.append(c); > > > } > > > sbuf.append('\''); > > > set(parameterIndex, sbuf.toString()); > > > } > > > } > > > } > > > −−−−−−−−−−−−−−−−−−−− > > > > > > > > > > > > ----- Original Message ----- > > > From: "福元 政明" <fukumoto@xxxxxxxxxx> > > > To: <ml@xxxxxxxxxx> > > > Sent: Thursday, August 22, 2002 2:40 PM > > > Subject: [mysql 05976] Re: JDBC での INSERT と UPDATE で日本語が ? に化 > > け > > > てしまいます > > > > > > > > > > ご指導ありがとうございます。 > > > > さっそく実行してみました。 > > > > 私の理解不足が影響しているせいか、結局 > > > > PreparedStatement(入力SQLのSJIS変換なしで) > > > > を使ってみたらうまくいきました。 > > > > ただ「−」とかの漢字が文字化けするようです。 > > > > なぜだろう? > > > > ちなみに、gweMysql JDBC Driver に対しても > > > > 以下のようにトライしましたが欠局うまくいかずあきらめました。 > > > > 1、mysql-connector-java-2.0.14.zipをダウンロード > > > > 2、解凍したmysql-connector-java-2.0.14-bin.jarをlibに配置 > > > > 3、接続のClass.forName("com.mysql.jdbc.Driver").newInstance();の部分 > > を > > > 変更 > > > > ところで質問ですが、なぜ PreparedStatement でうまくいったのか? > > > > 私の頭ではピントきません。 > > > > よろしければご指導の程お願い致します。 > > > > 以上 > > > > > > > > > -----Original Message----- > > > > > From: Cold Winter [SMTP:coldwinter@xxxxxxxxxx] > > > > > Sent: Thursday, August 22, 2002 12:05 PM > > > > > To: ml@xxxxxxxxxx > > > > > Subject: [mysql 05975] Re: JDBC での INSERT と UPDATE で日本語が > > ? > > > > > に化けてしまいます > > > > > > > > > > > SQL のエンコードに「8859_1 → Shift_JIS」の変換を "かけないで"実行 > > し > > > てみ > > > > > たら > > > > > > 「あいうえお」と入力したら「BDFHJ」と帰ってきました。 > > > > > > > > > > …そうですか…,となると,次の方法で回避することになると思います。 > > > > > > > > > > 1."gweMysql JDBC Driver" > > > (http://www.t3-jpn.com/jdbc/jdbcmysql.html)を > > > > > 使ってみる(過去ログ "[mysql 05893]") > > > > > > > > > > 2.PreparedStatement を使ってみる(過去ログ "[mysql 05889]") > > > > > > > > > > 3.MySQL DB エンジンそのものを Shift_JIS でコンパイルしなおす > > > > > (過去ログ "[mysql 05900]") > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > ----- Original Message ----- > > > > > From: "福元 政明" <fukumoto@xxxxxxxxxx> > > > > > To: <ml@xxxxxxxxxx> > > > > > Sent: Thursday, August 22, 2002 11:55 AM > > > > > Subject: [mysql 05973] Re: JDBC での INSERT と UPDATE で日本語が ? > > に > > > 化け > > > > > てしまいます > > > > > > > > > > > > > > > > お返事ありがとうございました。 > > > > > > ちなみに、 > > > > > > SQL のエンコードに「8859_1 → Shift_JIS」の変換を "かけないで"実行 > > し > > > てみ > > > > > たら > > > > > > 「あいうえお」と入力したら「BDFHJ」と帰ってきました。 > > > > > > とりあえずご報告まで。 > > > > > > > > > > > > > -----Original Message----- > > > > > > > From: Cold Winter [SMTP:coldwinter@xxxxxxxxxx] > > > > > > > Sent: Thursday, August 22, 2002 11:44 AM > > > > > > > To: ml@xxxxxxxxxx > > > > > > > Subject: [mysql 05972] Re: JDBC での INSERT と UPDATE で日本語 > > が > > > ? > > > > > > > に化けてしまいます > > > > > > > > > > > > > > 福元さん,はじめまして。 > > > > > > > > > > > > > > > 接続文字列では、 > > > > > > > > jdbc:mysql:///master1?useUnicode=true&characterEncoding=SJIS > > > > > > > > UpdateCount = sta.executeUpdate(new > > > > > > > > String(p1.getBytes("8859_1"),"Shift_JIS")); > > > > > > > > のようにきちんとSJIS変換しているつもりなのですが > > > > > > > > INSERTとUPDATEを行うと、「あ」のような日本後全てが「?」となっ > > て > > > > > > > > データベースに格納されているようです。 > > > > > > > > > > > > > > …次のような点を考慮してみるとよいかもしれません。 > > > > > > > > > > > > > > 1.SQL のエンコードに「8859_1 → Shift_JIS」の変換を "かけない > > で" > > > > > > > そのまま実行する > > > > > > > > > > > > > > 2.DB エンジンの起動状態のうち,キャラクターセットの設定を確認 > > す > > > る > > > > > > > > > > > > > > # 確認方法 > > > > > > > > > > > > > > "C:\work\> mysqladmin variables" ででてくる表の > > > character_set > > > > > > > の行が "sjis" であることを確認する,念の為 character_sets > > に > > > > > > > "sjis" が含まれていることも確認する > > > > > > > > > > > > > > > > > > > > > > > > > > > > ----- Original Message ----- > > > > > > > From: "福元 政明" <fukumoto@xxxxxxxxxx> > > > > > > > To: <ml@xxxxxxxxxx> > > > > > > > Sent: Thursday, August 22, 2002 11:38 AM > > > > > > > Subject: [mysql 05971] JDBC での INSERT と UPDATE で日本語が ? > > に > > > 化け > > > > > てし > > > > > > > まいます > > > > > > > > > > > > > > > > > > > > > > 福元と申します。 > > > > > > > > 環境は、Win2K + JDK1.4 + TOMCAT4.18です。 > > > > > > > > 実はタイトルのような不具合で悩んでおります。 > > > > > > > > 処理的には > > > > > > > > WEB-INF/lib/mm.mysql-2.0.13-you-must-unjar-me.jar > > > > > > > > 接続文字列では、 > > > > > > > > jdbc:mysql:///master1?useUnicode=true&characterEncoding=SJIS > > > > > > > > UpdateCount = sta.executeUpdate(new > > > > > > > > String(p1.getBytes("8859_1"),"Shift_JIS")); > > > > > > > > のようにきちんとSJIS変換しているつもりなのですが > > > > > > > > INSERTとUPDATEを行うと、「あ」のような日本後全てが「?」となっ > > て > > > > > > > > データベースに格納されているようです。 > > > > > > > > なみに、mysqlコマンドでINSERT文を実行したレコードについては、 > > 読 > > > み込 > > > > > んだ > > > > > > > 際に > > > > > > > > も○きちんと日本語表示されます。 > > > > > > > > なみに、本メーリングリストで紹介されていました > > > 「PreparedStatement」 > > > > > の動 > > > > > > > 作は > > > > > > > > まだ検証していません。 > > > > > > > > よろしくお願いします。 > > > > > > > > > > > > > > > > > > >
5980 2002-08-22 19:08 [福元 政明 <fukumoto@] Re: JDBC での INSERT と UPDATE で日本語が ? に化けてしまいます -> 5981 2002-08-22 19:37 ┗["Cold Winter" <coldw] 5983 2002-08-22 20:59 ┗["TAKAHASHI, Tomohiro]