プロが教えるわが家の防犯対策術!

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

A 回答 (3件)

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-sy …

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

この回答への補足

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

補足日時:2010/05/04 14:12
    • good
    • 0

Stringリテラル中において \ という文字は \\ で表す。

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

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

この回答への補足

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

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

補足日時:2010/05/04 11:24
    • good
    • 0

\→\\ではだめですか?


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

この回答への補足

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

補足日時:2010/05/04 11:29
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!