みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Javaでmysqlを操作して、ファイルのパスをレコードに登録する方法

Javaでmysqlを操作して、ファイルのパスをレコードに登録する方法
execute("update test_table set url = 'C:\test_mysql_java' where NO = 1;");
のように登録しようとしています。
ファイルの切れ目が「\」だとエラーが出てしまいます。(「/」ならOKでした)
executeの前に、文字の置き換えを試みましたが出来ませんでした。(「\」と「/」を入力しただけでエラー表示されます。)
eclipseを使用しています。
ご存じの方がおられましたら教えていただけませんでしょうか。

投稿日時 - 2010-05-03 19:42:28

QNo.5868958

すぐに回答ほしいです

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

execute("update test_table set url = 'C:\\\\test_mysql_java' where NO = 1;");
ではどうでしょうか。

Javaの文字列におけるエスケープとSQL文字列におけるエスケープが必要ですので2回エスケープする必要があります。
・Javaのエスケープシーケンス
http://www.site-cooler.com/java/j2se/06_02.htm#2
・MySQLのエスケープシーケンス
http://dev.mysql.com/doc/refman/4.1/ja/string-syntax.html

SQLのエスケープはDBMSによって仕様がことなるかもしれないため、MySQLから他のDBMSに変更する場合は注意してください。
(Oracleではエスケープ文字を任意に指定できたりとかしたはず)

投稿日時 - 2010-05-04 12:06:17

補足

すみません。試してみましたが同じ結果となりました。
eclipseではパスを\ではなく/で記入しないとエラー表示になります。
getAbsolutePath()で\でコンソールに表示されるということは、
内部で\を/にかえる方法が分かれば解決すると思います。
\はエスケースシーケンスとしてソースは判断し、文字が消えると思います。
文字列の置き換えという発想ではなく、getAbsolutePath()内で行われているフォルダーのバッファリングの切れ目で/を挿入するという方法をとればいいのではないかと気がつきました。
この方法についてご存じでしたら教えてください。
よろしくお願いいたします。

投稿日時 - 2010-05-04 14:12:16

このQ&Aは役に立ちましたか?

4人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

Stringリテラル中において \ という文字は \\ で表す。\t はタブ文字を表す。
つまりStringリテラル中の C:\test_mysql_java という表記は質問者の思っていたものを多分表していない。

また、もし置換などで正規表現を使用しているなら、
\ をそういう文字として表すためには正規表現レベルでも \\ と表記しないといけないため、
Stringリテラルで表現された正規表現では \ という文字は \\\\ と書く必要がある。

投稿日時 - 2010-05-04 01:28:08

補足

URL取り出すメソッドをjFileChooserTest.getSelectedFile().getAbsolutePath()で、コンソールに出力するとurlは\区切りです。
しかし、SLQを発行するメソッドexecuteInsertではレコードに登録されると\が無くなってしまいます。executeInsertの前にgetAbsolutePath()で得られたURLの\を/に文字置き換えをしても\は無くなってしまいます。(vaguechat様のご回答とおりにしても同じです。)
また、直接プロンプトでSQLを発行すると入力したとおり登録されます。

どのタイミングで\が消えているのかわからない状態です。

投稿日時 - 2010-05-04 11:24:27

ANo.1

\→\\ではだめですか?
\はエスケープシーケンスのため、
\\とエスケープしてあげる必要があります。
ちなみに\tはタブを表します。

投稿日時 - 2010-05-04 01:25:25

補足

このようにしても、同じ状態です。
URLの文字列は登録されます。
しかし、\は\\にしても//にしても登録できないです。

投稿日時 - 2010-05-04 11:29:02

あなたにオススメの質問