工作中有个合并Mssql和Postgresql的数据到Mysql的需求。苦战完毕,记录下来以分享下各种蛋疼~~~
Let‘s go ahead step by step。
环境: Win2008 ; Mssql 2008 R2+SP3; Mysql ;
一年之计在于春,立春之日,诸位看官请先设置好mysql 的字段类型和字符集( set names utf-8)
(1) Windows下,Mysql不区分大小写,但是导入导出文件时是区分的。参数lower_case_table_names的值可取 0,1,2。0库名表名区分大小写 ,1库名表名不分大小写 ,2使用指定的大小写, 但显示的时候都显示为小写。 默认状态下 Windows系统下1 Linux系统下0 Mac系统下2
(2) Mysql中如果时间字段以Int类型存储通过from_unixtime转换,但是Int是4字节的和东八时区的概念,所以时间范围是1970-01-01 08:00:01到2038-01-19 11:14:07。
俩种方式可以实现:----- 当然肯定有简洁的第三方工具或者更多更好的方法,这里欢迎大家拍砖。
一 链接服务器导入导出
1. 下载mysql odbc驱动,安装。
2. MSSQL 创建数据源。需要注意:设置为system DNS ,character set 为GBK; 否则创建链接服务器时会找不见odbc驱动源和中文字符乱码
3. MSSQL 创建连接服务器,操作mysql语句如下:
(1) select * from openquery(TestMySQL,'select * from test.TestTable');
(2) insert into openquery(TestMySQL,'select * from test.TestTable') select 1,'TestName';
(3) delete from openquery(TestMySQL,'select * from test.TestTable');
(4) update openquery(TestMySQL,'select * from test.TestTable') set TestName='ABCDE' where TestID=1;
ps: 此种方法对大数据量来说慢的无法接受,所以大数据的话不推荐使用。
二 文件形式导出导入
1. Mssql 通过BCP的方式导出文件
------exec master..xp_cmdshell 'bcp "SELECT REPLACE(REPLACE(Alias,'';'',''\;''),''\'',''\\''), DateDiff(SECOND,''1970-01-01 8:00'',LoginTime) from Demo.dbo.Demo" queryout D:\demo\demo.txt -t";" -r "\r\n" -c -T';
(1) 利用sql语句对字段NULL值等进行处理,尤其要注意以 “;“作为字段分隔符,中文字段值包含”;“,末位值是”\“的情况,可以参考下我的sql。
(2) 导出的文件通过UE工具从ANCI转换为UTF-8
2. Mysql 通过load data 方式导入文件
-------load data infile 'D:/demo/demo.txt' into table Users character set utf8 fields terminated by ";" escaped by "\\" lines terminated by "\r\n" ;
3. Mysqldump
------mysqldump -uroot -p --default-character-set=utf8 --opt --extended-insert=false --hex-blob --single-transaction -t demo Demo >d:/demo/Demo.sql
三 Postgresql 用copy导出文件
-----COPY (select id , COALESCE(alias,0),COALESCE(name,0) from demo) TO '/data/demo.sql' DELIMITER ';' null '';