Quantcast
Channel: 碳基体
Viewing all articles
Browse latest Browse all 75

大数据之MySQL 到 MongoDB 的迁移 (处理中文乱码, 特殊符号)

$
0
0
MySQL,MongoDB数据之间迁徙,一般都采用数据库自带的导入导出工具。网上也有不少文章来介绍如何做。这里概括的总结一下。

一、自带工具导入导出
第一步:使用phpMyadmin导出csv格式的数据
MySQL 到 MongoDB 的迁移 (处理中文乱码, 特殊符号) - 碳基体 - 碳基体
注意红框的部分

第二步:使用mongodbimport将上一步导出的csv文件导入
 

mongoimport -d DBName(数据库名) -c CollectionName(集合名) -type csv(文件类型,若文件类型为json则不需要指定) -file FileName.csv(文件名)  -h host(主机名或主机ip,本机不需要指定)--port  27017(端口号,若使用默认端口号则不需要指定)-u tanjiti(用户名) -p xxxx(密码) --headerline (把文件第一行当成字段名)--drop (删除已存在的集合)


二、Perl脚本导入导出
为了避免中文乱码,诡异的符号转换(我试过在MySQL数据库存入代码,导出了完全面目全非了),还是偏向于用脚本来处理。 接下来讲讲如何使用perl脚本来进行数据库的导入导出。

1.  准备工作,编码统一
首先指定编码了,MongoDB目前只支持UTF-8(二进制格式除外),所以我们需要将MySQL指定为该种编码

在centos下,使用以下方法设置MySQL编码

vim /etc/my.cnf

在[client]下添加
default-character-set=utf8
在[mysqld]下添加
default-character-set=utf8

在debian下,使用以下方法设置MySQL编码

vim /etc/mysql/my.cnf

在[client]下添加
default-character-set=utf8
在[mysqld]下添加
character_set_server=utf8
重启MySQL,然后查看设置是否成功

mysql> show variables like 'character_set_%';

2. 脚本

#! /usr/bin/perl -w
use DBI; #处理MySQL
use MongoDB; #处理MongoDB
use MongoDB::OID;
use Encode; #处理编码

use MongoDB::BSON;


#mysql 数据库配置
my $driver = "DBI:mysql";
my $database = "DatabaseName";
my $host = "HostName";
my $user = "UserName";
my $password = "Password";

#mongoDB数据库配置
my $database_mo = "DatabaseName";
my $host_mo = "HostName";
my $port = 27017;
my $collection = "CollectionName";
my $user_mo = "UserName";
my $password_mo = "Password";


################################################################

#####从MySQL数据库读取数据,存储到数组@QueryCollection中#######

#########################################################

my @QueryCollection = ();


#创建MySQL数据库连接

my $dbi = DBI->connect("$driver:database=$database;host=$host;user=$user;password=$password") or die "Cannot connect: ".DBI->errstr;


#统一MySQL客户端与服务端的编码为utf8,这一步非常重要,解决乱码

$dbi->do("SET character_set_client = 'utf8'");
$dbi->do("SET character_set_connection = 'utf8'");
$dbi->do("SET character_set_results = 'utf8'");


#构造SQL查询语句

my $sth = $dbi->prepare("select * from TableName") or die "Cannot prepare sql statement".DBI->errstr;

#执行查询
$sth->execute();


#存储查询结果集到数组@QueryCollection中my $i=0;


while(my $row = $sth->fetchrow_hashref()){

#将单条查询结果存入到散列
%QueryCollection中
my %
QueryCollection = ();

#替换ColumnName为具体的列名
$
QueryCollection{"ColumnName1"} = $row->{ColumnName1};
$
QueryCollection{"ColunmName2"} = $row->{ColumnName2};
...

#将散列
%QueryCollection的引用存储到数组@QueryCollection中
$
QueryCollection[$i] = \%QueryCollection;
$i++;
}

#关闭查询
$sth->finish();

#关闭MySQL连接
$dbi->disconnect();


################################################################

#####将数组@QueryCollection中的结果集插入到MongoDB中#######

#########################################################

#创建MongoDB 连接
my $conn = MongoDB::MongoClient->new("host" => $host_mo, "username" => $user_mo, "password" => $password_mo, "db_name" => $database_mo, "port" => $port);

#指定数据库
my $db = $conn->get_database($database_mo);


#指定集合名
my $coll = $db->get_collection($collection);


foreach(@QueryCollection){
my %
QueryCollection = %$_;

#替换ColumnName为具体的列名 (字段名)
my $
ColumnName1 = $QueryCollection{"ColumnName1"};
my $
ColumnName2 = $QueryCollection{"ColumnName2"};
....

#将对应的列(字段)插入MongoDB中,如果列(字段)中包含中文字符,需要先进行utf8解码,mongodb-perl驱动

#会先将字符encode为utf8后插入
$MongoDB::BSON::looks_like_number = 1; #为了将变量以数据类型的插入MongoDB中

$coll->insert({ColumnName1 => $ColumnName1, ColumnName2=>decode_utf8($ColumnName2)});

}







Viewing all articles
Browse latest Browse all 75

Trending Articles