MySQL 将具有特殊字符的文本字段导出到 outfile
MySQL export text fields with special characters to outfile
我正在尝试将一些查询结果导出到 CSV 或 TAB 分隔文件。其中一个字段是包含特殊字符的文本 blob,可能包括单引号和双引号 ("
、'
)、换行符 (\n
) 和制表符 (\t
).
+------+------+--------------------------------------------------------+
| col1 | col2 | text |
+------+------+--------------------------------------------------------+
| 1 | foo | Oh hey why not "this" or t'is |
or a newline while we are at it |
+------+------+--------------------------------------------------------+
这是我正在使用的查询,对于 TAB 分隔文件,使用 \t
而不是 ,
。
SELECT col1, col2, text
FROM mytable
INTO OUTFILE '/tmp/foo.csv'
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n';
这不适用于 CSV 或 TAB 分隔文件,因为文本字段中的任何逗号或引号或制表符最终会将文本 blob 拆分为任何导出文件中的多行 and/or 列。
真题:
是否有任何方法可以在文本字段中转义 ", ', \t, \n
等特殊字符并写入 CSV 或 TAB 文件,或者在尝试写入文件之前是否需要替换这些字符?
如果要替换这些,我会尝试使用 REPLACE
函数从 this question 中的代码开始,但我更喜欢保留原始文本的内容。
谢谢。
好吧,我不知道如何转义所有特殊字符,所以这里有一个在有问题的字符上使用 REPLACE
的解决方案:
SELECT col1, col2,
replace(replace(replace(text, '\n', 'n'), ',', '\,'), '\"', '\'') text
FROM mytable
INTO OUTFILE '/tmp/foo.csv'
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n';
我正在尝试将一些查询结果导出到 CSV 或 TAB 分隔文件。其中一个字段是包含特殊字符的文本 blob,可能包括单引号和双引号 ("
、'
)、换行符 (\n
) 和制表符 (\t
).
+------+------+--------------------------------------------------------+
| col1 | col2 | text |
+------+------+--------------------------------------------------------+
| 1 | foo | Oh hey why not "this" or t'is |
or a newline while we are at it |
+------+------+--------------------------------------------------------+
这是我正在使用的查询,对于 TAB 分隔文件,使用 \t
而不是 ,
。
SELECT col1, col2, text
FROM mytable
INTO OUTFILE '/tmp/foo.csv'
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n';
这不适用于 CSV 或 TAB 分隔文件,因为文本字段中的任何逗号或引号或制表符最终会将文本 blob 拆分为任何导出文件中的多行 and/or 列。
真题:
是否有任何方法可以在文本字段中转义 ", ', \t, \n
等特殊字符并写入 CSV 或 TAB 文件,或者在尝试写入文件之前是否需要替换这些字符?
如果要替换这些,我会尝试使用 REPLACE
函数从 this question 中的代码开始,但我更喜欢保留原始文本的内容。
谢谢。
好吧,我不知道如何转义所有特殊字符,所以这里有一个在有问题的字符上使用 REPLACE
的解决方案:
SELECT col1, col2,
replace(replace(replace(text, '\n', 'n'), ',', '\,'), '\"', '\'') text
FROM mytable
INTO OUTFILE '/tmp/foo.csv'
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n';