2017-01-02 6 views
1

データベーステーブルからフォルダーとワイルドカードのリストを作成するためのクエリを作成しており、多数のフォルダをコピーするためにバッチファイルで使用されます。私が関心を持っているものを返すクエリを書いたのですが、mysqlクライアント自体よりもファイルへのエクスポートやコンソールへの表示時にクエリの結果が異なることに気付きました。具体的には、 "\"文字を2倍にしてエスケープしていますが、ファイルに書き込むときにエスケープ文字が表示されます。私は同じ書き込みただしmysqlクエリの結果がエクスポートファイルと異なるコンソール

mysql> SELECT CONCAT('\\',SUBSTR("Foo",1,1),'\\',"Foo",'\\*.*') AS 'List'; 
+------------+ 
| List  | 
+------------+ 
| \F\Foo\*.* | 
+------------+ 
1 row in set (0.00 sec) 

:クエリは、私が期待する結果を返しますmysqlコマンドラインから

SELECT CONCAT('\\',SUBSTR("Foo",1,1),'\\',"Foo",'\\*.*') AS 'List'; 

次のように

私が使用したクエリの例です。 test.sqlという名前のファイルにクエリを実行し、クエリをパイプして出力を表示またはパイプします。出力にエスケープ文字が表示されています。

C:\testing123>echo SELECT CONCAT('\\',SUBSTR("Foo",1,1),'\\', "Foo",'\\*.*') AS 'List'; > test.sql 

C:\testing123>mysql < test.sql 

List 
\\F\\Foo\\*.* 

INTO OUTFILEを使用すると同じ結果が得られます

私はtest.sqlクエリファイルからエスケープ文字を削除しようとしましたが、クエリによってエラーが発生するだけです(期待どおり)。

答えて

1

異なる出力方法では、文字エスケープに関する異なるsql_modeを使用することがあります。コマンドset sql_mode = 'NO_BACKSLASH_ESCAPES';でエスケープ文字を無効にすると、問合せの上、コンソールでも、あなたに2つのバックスラッシュを与える(またはあなただけのクエリ内の1つのバックスラッシュを記述する場合は、エラーを抑制します) :

set sql_mode = 'NO_BACKSLASH_ESCAPES'; 
SELECT CONCAT('\',SUBSTR("Foo",1,1),'\',"Foo",'\*.*') AS 'List'; 
-> \F\Foo\*.* 

set sql_mode = 'NO_BACKSLASH_ESCAPES'; 
SELECT CONCAT('\\',SUBSTR("Foo",1,1),'\\',"Foo",'\\*.*') AS 'List'; 
-> \\F\\Foo\\*.* 

set sql_mode = ''; 
SELECT CONCAT('\\',SUBSTR("Foo",1,1),'\\',"Foo",'\\*.*') AS 'List'; 
-> \F\Foo\*.* 

set sql_mode = ''; 
SELECT CONCAT('\',SUBSTR("Foo",1,1),'\',"Foo",'\*.*') AS 'List'; 
-> You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\',"Foo",'\*.*') AS 'List'' at line 1 
+0

は私がいた、あなたのステファンありがとう私の目標を達成するためにSET sql_mode = 'NO_BACKSLASH_ESCAPES'とINTO OUTFILEを使用することができます。 –

関連する問題