2017-01-02 31 views
1

我正在编写一个查询来创建数据库表中的文件夹和通配符列表,然后这些数据库表将用于批处理文件以复制大量文件夹。我写了一个查询,它返回我感兴趣的内容,但是我注意到,导出到文件或显示到控制台的查询结果与mysql客户端本身的查询结果不同。具体来说,我通过将“\”字符翻倍来避开“\”字符,但是在写入转义字符显示的文件时。mysql在控制台中的查询结果与导出文件中的不同

我使用的查询的一个例子是如下:

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

从MySQL命令行查询返回结果,我期望:

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

但是如果我写相同的查询到一个名为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';逃逸,那么上面的查询会给你两个反斜杠也在控制台(或将抑制错误,如果你只写在查询一个反斜杠):

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来实现我的目标。 –

相关问题