• 締切済み

mysqlバッチモードでのエスケープ文字

mysqlでエスケープ文字を含んだファイルをバッチモードでクエリーを実行させた時、エスケープ文字がそのまま出力ファイルに記述されます。(\tがTABにならずに、\tのまま出力される) バッチモードの場合、どのようにしたらエスケープ文字を正常に出力させる事が出来るのでしょうか。 ちなみに、同様のクエリーをmysql(コマンドラインツール)を起動して直接入力し動作させる、 およびMysql Control Centerで行うと、期待通りの表示(\tはTAB)になります。 よろしくお願いします。Mysqlは ver4.0.18-max-ntです。

  • fucha
  • お礼率66% (2/3)
  • MySQL
  • 回答数2
  • ありがとう数1

みんなの回答

回答No.2

linuxでも症状は同じでした。select 'a\tb';というsql文でテストしましたが、mysql上でsqlを入力するとちゃんと[tab]が表現されますが、mysql < test.sqlとすると1行目、行の見出し部分は[tab]になるのですが2行目の結果の部分は「a\tb」と表示されてしまいますね。 最初はシェルが勝手に\tをエスケープしているのかと思ったのですが1行目が[tab]になっているところを見るとそうではないようで。 原因がわからなければ適当な区切り文字で一旦出力して、その後タブに置換したらどうでしょうか。

fucha
質問者

お礼

ありがとうございました。結局バッチモードではエスケープ文字はうまく表現できないと解釈するしかないようですね。ちなみにPostgreでは出来てました。

回答No.1

\tを\\tにしたらどうなりますか?

fucha
質問者

補足

\tを\\tにしても、出力ファイルには\\tが出力されました。 ちなみに、dos窓で以下のようにして実行しています。 c:\mysql\bin>mysql -u root -p <mysql -u root -p <./test.sql >./test_out.txt http://dev.mysql.com/doc/mysql/ja/batch-mode.htmlにWindowsでの特殊文字による問題発生の場合が示されていたので、 c:\mysql\bin>mysql -u root -p -e "source ./test.sql" >"./test_out.txt" としても、結果は同様でした。 クエリ(test.sql)の中身 use shop; select concat(EmployeeName, "さん\t", "[E-MAIL]\t", EMail) as "[連絡先]" from Employees; 結果(test_out.txt) [連絡先] AAAさん\t[E-MAIL]\tAAA@test BBBさん\t[E-MAIL]\tBBB@test CCCさん\t[E-MAIL]\tCCC@test mysql(コマンドラインツール),Mysql Control Centerでは、test.sqlの中身をカット&ペーストして行っています。

関連するQ&A

  • HTMLタグのエスケープ文字をタグに戻す方法

    JavaのBufferedReaderクラスを使用して HTMLファイルを1行ずつ読み込んでまた、別のファイルに出力したところ HTMLファイル内では <br /> と表示されているところが出力ファイルでは &lt;br /&gt; というようにエスケープ文字で出力されてしまいました。 タグをそのまま出力したいのですがエスケープ文字で出力されないようにするためには どのようにすればよろしいでしょうか。

    • ベストアンサー
    • Java
  • 【PHP・MySQL】一文字だけ抜き出したい

    php・MySQL初心者です。 何とかここまで自力でやってこれたのですが、もうお手上げで…。 サンプルコードを解析し、部分的に理解しながら進んでる状態です。 やりたいことは、 「ユーザーが入力した文字列の最後の1文字だけを抜き出し、データベースに代入する」です。 ←(2) ちなみに、 「ユーザーが入力した文字列をそのまま、データベースに代入する」はできました。←(1) 参考に、(1)のソースコードの一部を書きます。 ------------------------------------------- 『main.php』 <form action="result.php" method="POST" enctype="multipart/form-data"> <input type="hidden" name="MAX_FILE_SIZE" value="<?= $file_maxsize ?>"> タイトル:<INPUT type="text" name="title" size="50"><br> コメント:<INPUT type="text" name="comment" size="50"><br> <input type="submit" value="送信"> </form><hr> ------------------------------------------- 『result.php』 $comment = @trim($_REQUEST['comment']); //※ $query = "insert into main_t (comment, last)" . " values ('$comment', '$last')"; $result = mysql_query($query); ------------------------------------------- だいたいこんな感じで(1)は出来ました。 (関係がありそうなところだけを抜き出したつもりです…) 『main.php』で出力して確認もしました。 (2)の現状の私のコードを書きます。 ------------------------------------------- 『result.php』 $x = mysql_query("select right('$title', 1)"); $last = mysql_fetch_assoc($x); ------------------------------------------- これを(1)の //※  の部分に記述してみましたが、うまくいきません。 出力するとなぜか「Ar」と出てきます…泣 『select right('いちもじ', 1)』で『じ』とちゃんと右一文字が取り出せるのをbatファイル?みたいなので確認しました。 このSQL文をPHP内で行いたいのですが、やり方がわかりません…。 (そもそも根本的に間違っているのでしょうか…) $x = mysql_query("select * from ○○ where 条件"); $last = mysql_fetch_assoc($x); みたいにfromで検索先や条件を指定して得た「配列」を取得し、表示する方法はネット検索で沢山見つかったのですが、fromやwhereを使わず、結果も配列ではなく1つだけ得られるような場合は、どうすればよいのでしょうか? わかりづらい文章ですみません; 難しい質問かとは思いますが、PHPやMySQLに詳しい方がいましたら、是非ともご教授いただけたらと思います。 よろしくお願いいたします。

  • Perlで変数中のエスケープされた特殊文字を展開

    Perlで、変数に既に格納されているエスケープされた特殊文字を、もとの文字に展開するには どのようにしたらよいでしょうか。 つまり、\t という値で格納されているのをタブ文字にしたり、\\ という値であれば\の一文字に するという事です。 ダブルクォートで定義すれば展開されると思いましたが、展開は変数の代入時に行われるだけで、 既に変数中にエスケープされて入っているものはダブルクォートを使い変数を囲んだりしても展開されません。 下記は簡単な例でやろうとしてる事を示したものです。 add変数に\tというタブを意味するエスケープされた特殊文字を含んでいるとして、その\tを タブとして展開し、abc defのようにさせたいのですが、abc\tdefと入ってしまいます。 $ cat unescape.pl #!/bin/perl $add = '\tdef'; #シングルクォートで代入すると、もちろんエスケープされたまま代入される #$add = "\tdef"; #ダブルクォートで代入すると代入時にタブへ展開される #$add = $ARGV[0]; #本当はAGRVからエスケープ特殊文字を含んだ文字列を取りたい。ARGVから代入すると、シングルクォートの時のようにそのまま代入される $tgt = 'abc'; print "add: " . $add , "\n"; print "before: " . $tgt . "\n"; $tgt .= "$add"; #既にエスケープされた形で代入されているものを、ダブルクォートで囲んで使っても展開されない print "after: " . $tgt . "\n"; $ perl unescape.pl add: \tdef before: abc after: abc\tdef

    • ベストアンサー
    • Perl
  • エスケープ文字の変換

    お世話になります。 今、php+mysqlでシステム作成中なのですが、 エスケープ文字の扱いで悩んでいます。 DBへinsertするデータに、 "c:\sato\仕事\見積もり" という文字列があったとすると、そのままinsertすると、エスケープ文字が無くなり、 "c:sato仕事見積もり" となります。 そこで、str_replace関数で、"\"マークを"/"で置き換え、insertしました。 しかし、違うデータで、 "c:\suzuki\仕事\開発予定表" という文字列をinsertしなければならなくなりました。 ほかの質問でも確認しましたが、最後の"表"という文字は、shift-jisでは文字化けしてします。("・"になってしまいました) 置き換えするなど小細工で何とか回避する方法はないでしょうか?? 現状、php、mysqlともにshift-jisで統一しています。 また、この元データは、shift-jisのCSVファイルから取り込んでいます。 このあたりでの問題は無いのでしょうか? よろしくご教授願います。

    • ベストアンサー
    • PHP
  • JSPのエスケープ文字について

    JSPのコーディングで困っています。 以下のようにプルダウンを作成したいのですが、JSPのスクリプトレットとエスケープ文字がどうやら相性が悪いのか、想定と違う結果が画面に表示されてしまいます。 <JSPのコーディング>  <option value=<%=xxxxx%>>"&%<></option>  (xxxxxは定義済の変数です) <出力結果>  >"&%<> <期待結果>  "&%<> どうやら「"&%<>」のようにエスケープ文字で構成された文字列を間に挟むと、<option>タブの末尾の「>」が先頭に出てきてしまうようなんです。 どなたがJSPやJavaにお詳しい方、アドバイスをお願いします!

    • ベストアンサー
    • CSS
  • PHP+MySQLで文字化けします

    PHPでMySQLに接続して以下のように テーブルの作成・そのテーブルにInsertをすると文字化けします。 PHPサーバーの文字コードはEUC-JP、MySQLの文字コードはlatin1です。 PHPのバージョンは5.04でMySQLのバージョンは4.1.20です。 無料レンタルサーバーなので詳細な設定は変更できません。 <?php // データベースに接続し、選択する mb_language('Japanese'); mb_internal_encoding('UTF-8'); mb_http_output('UTF-8'); $link = mysql_connect('localhost',"user","password") or die('Could not connect: ' . mysql_error()); echo 'Connected successfully'; mysql_select_db('user') or die('Could not select database'); mysql_query("SET NAMES UTF-8",$link); // SQL クエリを実行する $name = 'test'; $query = "CREATE TABLE IF NOT EXISTS `$name` ( `id` varchar(50) primary key, `name` varchar(50), `pw` varchar(50) );"; $result = mysql_query($query) or die('Query failed: ' . mysql_error()); $query = "INSERT INTO $name (id, name) VALUES('test', 'テスト');"; $mojicode = mb_detect_encoding($query); $query = mb_convert_encoding($query, "UTF-8", "$mojicode"); $result = mysql_query($query) or die('Query failed: ' . mysql_error()); // HTML に結果を出力する echo "<table>\n"; while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) { echo "\t<tr>\n"; foreach ($line as $col_value) { echo "\t\t<td>$col_value</td>\n"; } echo "\t</tr>\n"; } echo "</table>\n"; // 結果セットを開放する mysql_free_result($result); // 接続を閉じる mysql_close($link); ?> まだまだPHP、MySQL共に技術が未熟なため 説明不足な部分が多々あるかと思いますがご教授お願いします。

    • ベストアンサー
    • PHP
  • Mysqlエスケープ文字回避の構文について

    現在、 開発言語「VBA」 データベース「Mysql」 で開発をおこなっています。SQL構文を実行する際、エスケープ文字が入力された場合、致命的エラーが発生してしまいます。 INSERT INTO T_Test VALUES ( '\','\','\','100','2009/09/02 16:03:26') この場合回避策はどのようにおこなうのがいいでしょうか? 複数画面でSQL文を実行しているところがあるので一番手間のかからない修正方法はないでしょうか?? VALUESでセットしている値は画面のテキストから入力された値などです。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • 環境変数とエスケープ文字の使い方教えて下さい。

    NTBackupで「別の場所にバックアップ レポートのログを保存する方法」を実行ユーザを意識しない形で実装したいです。 http://support.microsoft.com/kb/241162/ja 具体的には下記パスの"User_Name"を環境変数に置き換え対処したいと思っています。 旧 : "Documents and Settings\User_Name\Local Settings\Application Data\Microsoft\Windows NT\NTbackup\Data" 新 : %HOMEDRIVE%%HOMEPATH%\Local Settings\Application Data\Microsoft\Windows NT\NTbackup\Data しかしこのコマンドで実装するとバッチエンジンは特殊文字がエスケープされてないため実行できません。 新2 : "%HOMEDRIVE%%HOMEPATH%\Local Settings\Application Data\Microsoft\Windows NT\NTbackup\Data" この様にするとコマンドプロンプトで実行は出来ますが、バッチでは実行できません。 どの様にエスケープすればいいのでしょうか? 環境 : Windows Server 2003 SP2

  • バッチでEnterを認識させるには

    困ってます 分かる方いたら教えてほしいのですが バッチファイル内でEnterを認識させる方法ってありますか? たとえば time dir なんてバッチだとtimeが表示されて、time変更なしのEnterを待って dirが実行されますよね そこをEnter待ちが無いようにしたいんです。 NTなんでtime /tとか使えばいいんですけど /tつけると秒数が出なくなってしまいますよね、秒がほしいので 今回/tは却下です。 もし。/tつけても時:分:秒が出力できる手段があればそちらも 教えてもらえるとありがたいです。 お願いしますm(__)m

  • PHP+MySQLでエスケープされたデータを格納したい。

    php.iniの設定でmagic_quotes_gpc = Offにして、 mysql_real_escape_stringで出力エスケープしたデータを MySQLに格納するとバックスラッシュが格納されない。 エスケープされたデータを格納したいです。 php.iniの設定 --------------------------------------------------------- ; Magic quotes for incoming GET/POST/Cookie data. ; magic_quotes_gpc = On magic_quotes_gpc = Off ; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc. magic_quotes_runtime = Off ; Use Sybase-style magic quotes (escape ' with '' instead of '). magic_quotes_sybase = Off --------------------------------------------------------- $_POST['us_fname']には「'user'」という文字列が格納されています。 --------------------------------------------------------- $clean['us_fname'] = $_POST['us_fname']; $mysql['us_fname'] = mysql_real_escape_string($clean['us_fname']); $sql = "insert into table ( us_fname ) values ( '".$mysql['us_fname']."', ) "; --------------------------------------------------------- echo $mysql['us_fname']; で確認すると「\"user\" 」となっているんですが、 MySQLの中を確認すると「'user'」のままでシングルクォートがエスケープされていません。

    • ベストアンサー
    • PHP