昨天更详细地研究了一下MySQL中的转义符, 其实这不是MySQL专有的, 我们常用的CSV文件格式, 或是Microsoft SQL Server或Sybase能接受的文本文件, 都有同样的转义符定义, 这其实是一个数据交换的标准, 只是Oracle并没有好好地顺从这个标准. 但SQLULDR2的主要任务是将数据从Oracle方便地迁移到其他的数据库, 所以就需要将转义符的支持进行到底了.

    最新版本的SQLULDR2可以对六个字符进行转义处理, 指定的转义符本身, 单引号, 双引号, 回车符, 换行符及TAB键. 我们来测试一下, 在一个表的字段值插入这六个字符组成的字符串.

SQL> create table escape_test (col1 varchar2(100));

表已创建。

SQL> INSERT INTO ESCAPE_TEST VALUES ('''\"'||CHR(9)||CHR(13)||CHR(10));

已创建 1 行。

    然后用SQLULDR来导出, 需要指定ESCAPE选项.

D:\>sqluldr2 sys query="select * from system.escape_test" escape=\ quote='
      0 rows exported at 2009-10-27 09:14:46, size 0 MB.
      1 rows exported at 2009-10-27 09:14:46, size 0 MB.
        output file uldrdata.txt closed at 1 rows, size 0 MB.

    如果是巨量数据导出, 使用ESCAPE选项时性能可能会有很大的下降, 或者CPU的使用量会上升很多.

D:\>type uldrdata.txt
'\'\\\"\t\r\n'

    可以看到, 这六个字符全被转义了, 有了这个功能, 可以生成更好的CSV文件, 就可以始终用逗号分隔字符, 用换行分隔记录了, 不必费心地选择字符分隔符与记录分隔符了.