« SQLULDR2处理MySQL转义符 »
Tools » http://www.anysql.net/tools/sqluldr2-mysql-escape-char.html 2009-10-26继上一次发现了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字段值中有不可见字符, 那就回到第一种方法吧.


对SQLULDR2加了一个ESCAPE选项, 当值中出现ESCAPE字符时, 会写成两个ESCAPE字符.
例如: Oracle中的值为\, 当我们指定ESCAPE为\时, 导出文本时这个字段就成了\\, 这样才是真的完全支持MySQL.