继上一次发现了SQLULDR2对MySQL NULL的支持问题后, 在进一步迁移大数据量的测试中, 又发现了转义字符的问题, 在Oracle的字段值中, 出现了MySQL中的转义符, 例如Oracle中有这样的值.

SQL> select col1 from test;

COL

A\B

    继续测试了其他的一些不常见的字符作为转义符, 可是在几亿条记录中, 这些不常见的字符统统不可用. 这里我们有两个解决方法, 第一个是在源端替换, 使用Oracle的Replace函数, 如下所示:

SQL> select replace(COL1,’\',’\\’) as col1 from test;

COL1
—-
A\\B

    使用REPLACE函数, 有些不方便, 要在SELECT的很多字段上都加上REPLACE函数, 性能影响自不必说, 改SQL也是一件麻烦的事情, 于是就使用第二种方法, 使用不可见的字符来做控制符, 比如Control + Z, 其ASCII代码是26, MySQL中用\Z表示. 用SQLULDR2导出记录时, 指定如下NULL选项.

NULL=0x1AN

    接下来在MySQL导入时, 指定转义符为\Z就可以了.

LOAD DATA … ESCAPE BY ‘\Z’ …
LOAD DATA … ESCAPE BY X’1A’ …

    如果用了不可见字符还不行, 即Oracle字段值中有不可见字符, 那就回到第一种方法吧.