- ベストアンサー
Javaでmysqlを操作して、ファイルのパスをレコードに登録する方法
Javaでmysqlを操作して、ファイルのパスをレコードに登録する方法 execute("update test_table set url = 'C:\test_mysql_java' where NO = 1;"); のように登録しようとしています。 ファイルの切れ目が「\」だとエラーが出てしまいます。(「/」ならOKでした) executeの前に、文字の置き換えを試みましたが出来ませんでした。(「\」と「/」を入力しただけでエラー表示されます。) eclipseを使用しています。 ご存じの方がおられましたら教えていただけませんでしょうか。
- みんなの回答 (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-syntax.html SQLのエスケープはDBMSによって仕様がことなるかもしれないため、MySQLから他のDBMSに変更する場合は注意してください。 (Oracleではエスケープ文字を任意に指定できたりとかしたはず)
その他の回答 (2)
- vaguechat
- ベストアンサー率85% (47/55)
Stringリテラル中において \ という文字は \\ で表す。\t はタブ文字を表す。 つまりStringリテラル中の C:\test_mysql_java という表記は質問者の思っていたものを多分表していない。 また、もし置換などで正規表現を使用しているなら、 \ をそういう文字として表すためには正規表現レベルでも \\ と表記しないといけないため、 Stringリテラルで表現された正規表現では \ という文字は \\\\ と書く必要がある。
補足
URL取り出すメソッドをjFileChooserTest.getSelectedFile().getAbsolutePath()で、コンソールに出力するとurlは\区切りです。 しかし、SLQを発行するメソッドexecuteInsertではレコードに登録されると\が無くなってしまいます。executeInsertの前にgetAbsolutePath()で得られたURLの\を/に文字置き換えをしても\は無くなってしまいます。(vaguechat様のご回答とおりにしても同じです。) また、直接プロンプトでSQLを発行すると入力したとおり登録されます。 どのタイミングで\が消えているのかわからない状態です。
- kakusuke
- ベストアンサー率36% (95/259)
\→\\ではだめですか? \はエスケープシーケンスのため、 \\とエスケープしてあげる必要があります。 ちなみに\tはタブを表します。
補足
このようにしても、同じ状態です。 URLの文字列は登録されます。 しかし、\は\\にしても//にしても登録できないです。
補足
すみません。試してみましたが同じ結果となりました。 eclipseではパスを\ではなく/で記入しないとエラー表示になります。 getAbsolutePath()で\でコンソールに表示されるということは、 内部で\を/にかえる方法が分かれば解決すると思います。 \はエスケースシーケンスとしてソースは判断し、文字が消えると思います。 文字列の置き換えという発想ではなく、getAbsolutePath()内で行われているフォルダーのバッファリングの切れ目で/を挿入するという方法をとればいいのではないかと気がつきました。 この方法についてご存じでしたら教えてください。 よろしくお願いいたします。