我正在编写一个查询,将数据库表中的文件夹和通配符列表装箱,然后在批处理文件中使用这些列表复制大量文件夹。我编写了一个返回我感兴趣的内容的查询,但是我注意到,在导出到文件或显示到控制台时,查询结果与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\\*.*当我使用OUTFILE时,我得到了相同的结果
我尝试从test.sql查询文件中删除转义字符,但这只会导致查询抛出一个错误(正如预期的那样)。
发布于 2017-01-02 18:49:49
可能不同的输出方法在字符转义方面使用不同的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 1https://stackoverflow.com/questions/41431394
复制相似问题