MYSQL数据迁移到ORACLE中碰到的乱码问题的解决方法

47次阅读
没有评论

共计 4070 个字符,预计需要花费 11 分钟才能阅读完成。

本篇内容主要讲解“MYSQL 数据迁移到 ORACLE 中碰到的乱码问题的解决方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让丸趣 TV 小编来带大家学习“MYSQL 数据迁移到 ORACLE 中碰到的乱码问题的解决方法”吧!

MYSQL 字符集 UTF8,ORACLE 字符集 GBK
LINUX 5.3
MYSQL 5.1
ORACLE 9208
数据行数 1800W

基于这个数据量, 我们首先想到的是将 MYSQL 数据 DUMP 到文本文件, 再用 SQLLOAD 泵进 ORACLE.

但我们在第一步 (MYSQL 数据 DUMP 到文本文件,) 就出现了问题. 中文显示为乱码.

所以我们把首要问题先解决: 如何让 MYSQL 正确地 DUMP 到文本文件?

其实这个归根还是字符集的问题. 但在这个场景, 我们还要考虑到 MYSQL 对不同的输出方式也有不同的字符集转换模式.

首先来我们来看一下,DUMP 数据有多种方法:
1. set names gbk; select … into outfile /tmp/a1.txt from test.t1;
2. mysql -uroot -h227.0.0.1 –default-character-set=gbk -e select … from test.t1 /tmp/a1.txt
3. mysqldump -uroot -h227.0.0.1 –tab /tmp –fields-terminated-by= –lines-terminated-by= $$$$$ –default-character-set=utf8 test t1

创建测试表:
set names gbk;
CREATE TABLE `t1` (`col0` varchar(100) , `col1` varchar(100) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;
insert into t1 values (中国 , 1aaaaaa
select * from t1;

下面我们分别来看一下, 上面说的三种方法能不能正确 DUMP 中文到文本文件

1. set names gbk; select * into outfile /tmp/a1.txt from test.t1;
========================================================================
root@127.0.0.1 : (none) 15:35:26 use test;
Database changed
root@127.0.0.1 : test 15:35:27 set names gbk;
Query OK, 0 rows affected (0.00 sec)

root@127.0.0.1 : test 15:35:30 select * from t1;
+——+———+
| col0 | col1    |
+——+———+
| 中国 | 1aaaaaa |
+——+———+
1 row in set (0.00 sec)

root@127.0.0.1 : test 15:35:33 select * into outfile /tmp/a1.txt from test.t1;
Query OK, 1 row affected (0.00 sec)

root@127.0.0.1 : test 15:35:53 system cat /tmp/a1.txt
涓? 浗  1aaaaaa

root@127.0.0.1 : test 15:35:59 system hexdump /tmp/a1.txt
0000000 b8e4 e5ad bd9b 3109 6161 6161 6161 000a
000000f
========================================================================
注解: 用 MYSQL CLIENT GBK 看能正常显示中文, 但 OUTFILE 里存的却是 UTF8 的编码数据.
    在这里猜测是:
      当数据返回给 MYSQL 客户端的时候, 数据经过 character_set_results=gbk 的转换.
      当数据返回给 OUTFILE 的时候, 是直接 DUMP 数据.(经过测试,character_set_results 不管设成什么, 都不影响 OUTFILE 生成的结果)

2. mysql  -e select .. /tmp/a2.txt
========================================================================
[root@PerfTestDB1 tmp]#  mysql -uroot -h227.0.0.1 -N -s –default-character-set=gbk -e select * from test.t1 /tmp/a2.txt
[root@PerfTestDB1 tmp]# more /tmp/a2.txt
中国    1aaaaaa
[root@PerfTestDB1 tmp]# hexdump /tmp/a2.txt
0000000 d0d6 fab9 3109 6161 6161 6161 000a    
000000d
========================================================================
注解: 在这里能正常 DUMP 出来, 是因为返回给 MYSQL CLIENT 的时候, 已经经过 character_set_results=gbk 的转换.
  这个相当于第一种方法里的前半部分, 直接查看(select * from t1;)

3. mysqldump  (这种方式将会产生文件: .sql– 建表语句  .txt– 数据)
========================================================================
[root@PerfTestDB1 tmp]# mysqldump -uroot -h227.0.0.1 –tab /tmp –fields-terminated-by= –lines-terminated-by= $$$$$ –default-character-set=gbk test t1
[root@PerfTestDB1 tmp]# more t1.txt
涓? 浗 1aaaaaa$$$$$
[root@PerfTestDB1 tmp]# hexdump t1.txt
0000000 b8e4 e5ad bd9b 2626 3126 6161 6161 6161
0000010 2424 2424 0024                        
0000015
========================================================================
注解: 不管上面的 –default-character-set 设成 GBK/UTF8/LATIN1, 导出的结果都是一致的.
      其实这也说明这种方式也是直接将表的真实数据编码直接 DUMP 出来, 而没有经过转换.
      为了进一步证明上述的说法. 我 STRACE 了一下第 2, 第 3 两种方法.
     strace mysql -uroot -h227.0.0.1 -N -s –default-character-set=gbk -e select * from test.t1 /tmp/mysql.log
     strace mysqldump -uroot -h227.0.0.1 –tab /tmp –fields-terminated-by= –lines-terminated-by= $$$$$ –default-character-set=gbk test t1 /tmp/mysqldump.log

      通过查看日志文件:/tmp/mysql.log /tmp/mysqldump.log  , 发现在 mysql.log 中. 有这么一段:  
     —————————————————–
     munmap(0xb7f4e000, 4096)                = 0
     stat64(/usr/share/mysql/charsets/Index.xml , {st_mode=S_IFREG|0755, st_size=18173, …}) = 0
     open(/usr/share/mysql/charsets/Index.xml , O_RDONLY|O_LARGEFILE) = 3
     read(3, ?xml version= 1.0 encoding= ut …, 18173) = 18173
     close(3)    
     —————————————————–
      我想这正是 MYSQL 在做字符集转换. 而在 mysqldump.log 中没有找到.

再进一步跟踪另一种 MYSQLDUMP 备份方法(导成 SQL 语句).
     strace mysqldump -uroot -h227.0.0.1 –default-character-set=gbk test t1 mysqldump1.log
      你是不是发现在这里又出现了上面那一段?  (可以搜索:/usr/share/mysql/charsets/Index.xml)

4. 小结.

经过以上的测试. 那么现在我们可以知道, 想要中文正确的显示在文本文件里. 有两种方法:
1) mysql -uroot -h227.0.0.1 -N -s –default-character-set=gbk -e select * from test.t1 /tmp/a2.txt
2) select convert(name USING gbk) into outfile /tmp/a21.txt from test.t1 ;

到此,相信大家对“MYSQL 数据迁移到 ORACLE 中碰到的乱码问题的解决方法”有了更深的了解,不妨来实际操作一番吧!这里是丸趣 TV 网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-28发表,共计4070字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)