mysql字符集latin1迁移utf8的方法

场景说明:

1、现上几百台mysql数据库,字符编码latin1,现在需要做一个活动,将现上mysql数据库的一些活动数据同步到一台mysql汇总数据库(latin1),然后再将数据同步oracle中,最后官网显示。
2、oracle是活动库,字符集是ZHS16GBK,由于还有很大一部分数据都在oracle库中,所以需要将mysql中的数据同步到oracle中。
3、mysql中有一个字段name,内容是中文、各种火星文。
4、官网是用java开发的,所有项目都是以utf8编码的。
首先需要简单了解几个编码:

1、latin1是ISO-8859-1的别名,ISO-8859-1编码是单字节编码,因此在支持ISO-8859-1的系统中传输和存储其他任何编码的字节流都不会被抛弃。
换言之,把其他任何编码的字节流当作ISO-8859-1编码看待都没有问题。这是个很重要的特性,MySQL数据库默认编码是Latin1就是利用了这个特性。
ASCII编码是一个7位的容器,ISO-8859-1编码是一个8位的容器。
 
2、gbk,这个就不用说了,汉子的国标码,专门用来表示汉字,是双字节编码,gbk是gb2312的子集,gb2312是gb18030的子集。
 
3、utf8,这是一个变长编码,它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。
通过java程序解决思路:

1、将从mysql,iso-8859-1查询出来,再转成gbk的编码存储到oracle中,然后再以gbk的方式读出来官网显示。部分显示没有问题,但是gb18030无法显示火星文,很多火星文都显示成?。
2、将从mysql以utf8的编码读出,以utf8的编码存储到oracle中。这部分果断不行,为什么?因为mysql是latin1的编码,以utf8的编码是无法正常读出的,全部是乱码。
3、将mysql以ISO-8859-1的编码读出来,然后转成utf8,再以utf8的编码存储到oracle中。iso无法正常转成utf8,是不兼容的。
 
以上方法无法正常进行编码转换,只能在汇总数据库这边着手了。如果将汇总mysql的数据库转成utf8的,那么java程序就能正常显示。开始吧!!!
 
汇总数据库是能正常查看数据库的火星文的,linux支持比java要好多了,可能是由于开源与不开源的问题吧。
1、将数据库进行逻辑备份:

mysqldump --default-character-set=latin1 -q --single-transaction -t db_collect table1 table2 >db_collect.sql
 
2、重新创建ut8库和表结构
3、通过linux下面的iconv命令进行转码

LANG=en_US
CRT=default
sed -i 's/latin1/utf8/g'  db_collect.sql
iconv -f gb18030 -c -t UTF-8 db_collect.sql -o db_collect_result.sql
mysql -f db_collect2 < db_collect_result.sql
 
4、调整系统编码和CRT编码
LANG=en_US.UTF-8
CRT=UTF-8
5、正常显示数据,通过java程序以utf8的编码方式查看,展示正常。
有个问题,为什么java把latin1的转成gb18030火星文无法显示,在linux下用iconv命令转就可以呢?latin1不能直接转成gb18030,只能以gb18030编码为基础,再转给能够支持火星文的utf8.
显示没有问题了,但是新问题出现了,每次这样转码,会导致数据库无法使用。当然也可以增量进行转码,再导入,不过这样太麻烦了。
最后通过一个php脚本解决问题:直接从上百台数据库以默认的编码查询数据,再通过iconv转成utf8编码,直接insert到utf8表中。
但是这里需要注意的是,在insert前需要set names utf8;系统编码需要改成utf8.

php脚本:

$total_conn = open_mysql($total_mysql[1], $total_mysql[2], $total_mysql[3], $total_mysql[4]);
mysql_query("set names utf8;",$total_conn);
    ...省略
$total_sql = "insert into db_collect2.table1(name) values ('".iconv('gb18030','UTF-8',$list["name"])."');"
mysql_query($total_sql, $total_conn);
    ...省略

执行脚本:

export LANG=en_US.UTF-8
php /tmp/collect.php

时间: 2024-10-30 22:10:09

mysql字符集latin1迁移utf8的方法的相关文章

mysql通过my.cnf修改默认字符集为utf-8的方法和注意事项_Mysql

选项配置 配置文件路径: /full/path/mysql/bin/my.cnf (默认为/etc/my.cnf ) [client] default-character-set=utf8 [mysql] default-character-set=utf8 [mysqld] init_connect='SET collation_connection = utf8_unicode_ci' init_connect='SET NAMES utf8' character-set-server=ut

Linux下MySQL 5.5的修改字符集编码为UTF8(彻底解决中文乱码问题)

PS:昨天一同事遇到mysql 5.5中文乱码问题,找我解决.解决了,有个细节问题网上没人说,我就总结一下. 一.登录MySQL查看用SHOW VARIABLES LIKE 'character%';下字符集,显示如下:+--------------------------+----------------------------+| Variable_name | Value |+--------------------------+----------------------------+|

mysql字符集乱码问题解决方法介绍_Mysql

character-set-server/default-character-set:服务器字符集,默认情况下所采用的. character-set-database:数据库字符集. character-set-table:数据库表字符集. 优先级依次增加.所以一般情况下只需要设置character-set-server,而在创建数据库和表时不特别指定字符集,这样统一采用character-set-server字符集. character-set-client:客户端的字符集.客户端默认字符集.

MySQL字符集 GBK、GB2312、UTF8区别 解决MYSQL中文乱码问题_Mysql

MySQL中涉及的几个字符集 character-set-server/default-character-set:服务器字符集,默认情况下所采用的. character-set-database:数据库字符集. character-set-table:数据库表字符集. 优先级依次增加.所以一般情况下只需要设置character-set-server,而在创建数据库和表时不特别指定字符集,这样统一采用character-set-server字符集. character-set-client:客户

mysql字符集乱码解决方法总结

character-set-server/default-character-set:服务器字符集,默认情况下所采用的. character-set-database:数据库字符集. character-set-table:数据库表字符集. 优先级依次增加.所以一般情况下只需要设置character-set-server,而在创建数据库和表时不特别指定字符集,这样统一采用character-set-server字符集. character-set-client:客户端的字符集.客户端默认字符集.

【转贴】Linux下MySQL 5.5的修改字符集编码为UTF8(彻底解决中文乱码问题)

来源: http://www.ha97.com/5359.html PS:昨天一同事遇到mysql 5.5中文乱码问题,找我解决.解决了,有个细节问题网上没人说,我就总结一下. 一.登录MySQL查看用SHOW VARIABLES LIKE 'character%';下字符集,显示如下:+--------------------------+----------------------------+| Variable_name | Value |+-----------------------

完美转换MySQL的字符集 解决查看utf8源文件中的乱码问题_Mysql

MySQL从4.1版本开始才提出字符集的概念,所以对于MySQL4.0及其以下的版本,他们的字符集都是Latin1的,所以有时候需要对mysql的字符集进行一下转换,MySQL版本的升级.降级,特别是升级MySQL的版本,为了不让程序继续沿用Latin1字符集之后对以后Discuz!版本升级的影响和安装SupeSite,这就需要我们进行字符集的转换! 本人转换过好多数据了,也用过了好多的办法,个人感觉最好用的就是使用MySQL命令导出导入中将字符集转换过去! 现在我将用图文并茂的方式向大家展示一

mysql字符集查询与设置方法

说到底mysql 乱码的根源是的 mysql 字符集设置不当的问题. 有关查看 mysql 字符集的命令. 包括查看 mysql 数据库服务器字符集.查看 mysql 数据库字符集,以及数据表和字段的字符集.当前安装的 mysql 所支持的字符集等. 一.查看 mysql 数据库服务器和数据库字符集. mysql> show variables like '%char%';  +--------------------------+--------------------------------

MSSQL转MYSQL,gb2312转utf-8无乱码解决方法_MsSql

使用软件:MySQLMigrationTool 提示数据过大,无法导入.修改my.cnf文件的max_allowed_packet = 100M以上.在windows操作系统中,my.cnf有可能显示不出来,需要用编辑器直接输入地址:盘符:\目录mysql教程binmy.cnf打开. "there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause",MSSQL一个