随笔 - 55  文章 - 187  trackbacks - 0
<2008年6月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

常用链接

留言簿(12)

随笔分类

随笔档案

groovy

搜索

  •  

最新评论

阅读排行榜

评论排行榜

按照下面做法,终于成功了!庆祝,纪念......

背景:某个系统的mysql数据库dnname采用默认的latin1字符集,系统升级需要将所有数据转换成utf-8格式,目标数据库为newdbname(建库时使用utf8)

方法一:

步骤一 命令行执行:mysqldump --opt -hlocalhost -uroot -p*** --default-character-set=lantin1 dbname > /usr/local/dbname.sql

步骤二 将 dbname.sql文件中的create table语句的CHARSET=latin1改为CHARSET=utf8

步骤三 在dbname.sql文件中的insert语句之前加一条'set names utf8;'

步骤四 将dbname.sql转码为utf-8格式,建议使用UltraEditor,可以直接使用该编辑器的'转换->ASCII到UTF-8(Unicode编辑)',或者将文件另存为UTF-8(无BOM)格式

步骤五 命令行执行:mysql -hlocalhost -uroot -p*** --default-character-set=utf8 new_dbname < /usr/local/dbname.sql

总结:这种方法有个致命之处就是当数据中有大量中文字符和其他特殊符号字符时,很有可能导致在[步骤五]时报错导致无法正常导入数据,如果数据库比较大可以分别对每张表执行上述步骤

方法二(推荐大家使用):

为了解决第一种方法中总结时说到的问题,在网上苦苦查找了一天资料才东拼西凑的搞出一个比较稳妥的解决方法

步骤一 将待导出的数据表的表结构导出(可以用Phpmyadmin、mysqldump等,很简单就不说了),然后将导出的create table语句的CHARSET=latin1改为CHARSET=utf8,在目标库newdbname中执行该create table语句把表结构建好,接下来开始导出-导入数据。命令:

./mysqldump -d DB_Dig > /usr/local/tmp/tables.sql

 

步骤二 命令行:进入mysql命令行下,mysql -hlocalhost -uroot -p*** dbname

步骤三 执行SQL select * from tbname into outfile '/usr/local/tbname.sql';

步骤四 将tbname.sql转码为utf-8格式,建议使用UltraEditor,可以直接使用该编辑器的'转换->ASCII到UTF-8(Unicode编辑)',或者将文件另存为UTF-8(无BOM)格式

步骤五 在mysql命令行下执行语句 set character_set_database=utf8;  注:设置mysql的环境变量,这样mysql在下一步读取sql文件时将以utf8的形式去解释该文件内容

步骤六 在mysql命令行下执行语句 load data infile 'tbname.sql' into table newdbname.tbname;

注意:千万不要忘了第四步

采用第二种方法,所有数据均正常导入,且格式转换成功没有乱码。


参考:http://blog.csdn.net/guoguo1980/archive/2008/01/28/2070701.aspx

--------------------

    WE准高手

posted on 2008-06-11 16:54 大卫 阅读(8945) 评论(8)  编辑  收藏 所属分类: 数据库

FeedBack:
# re: mysql编码转换搞定[未登录] 2008-06-12 09:08 paul
lz上文中提到的BOM格式是什么,能具体解释下吗?前几天遇到resin3.0.x的jsp升级到resin3.1.x不能编译问题。查了一下也提到bom,但没明白、请lz赐教下  回复  更多评论
  
# re: mysql编码转换搞定 2008-06-12 16:07 懒人
@paul
resin3.0.x主要做哪方面开发来着?  回复  更多评论
  
# re: mysql编码转换搞定 2008-06-12 16:34 爱好编程
汗 你这篇文章基本上就是原文转载了 还参考啥
没有版权意识 真汗  回复  更多评论
  
# re: mysql编码转换搞定 2008-06-12 22:24 大卫
@paul
“BOM——Byte Order Mark,就是字节序标记。在这里找到一段关于BOM的说明:

在UCS 编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输字符"ZERO WIDTH NO-BREAK SPACE"。这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little- Endian的。因此字符"ZERO WIDTH NO-BREAK SPACE"又被称作BOM。

UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8编码是EF BB BF。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。Windows就是使用BOM来标记文本文件的编码方式的。”

我的理解,BOM就是一些附加信息,实际上不属于数据内容。  回复  更多评论
  
# re: mysql编码转换搞定 2008-06-12 22:27 大卫
@爱好编程
应该怎么做才有版权意识?我已经标注了文章出处了。
另外,我也加上了自己的一些标注,是便于自己记录的。
而且,我是在寻找了很多方法之后,经过此法才成功的,记录下来,有什么不对吗?  回复  更多评论
  
# re: mysql编码转换搞定[未登录] 2008-06-13 09:27 paul
@懒人
跟tomcat差不多。servlet容器吧  回复  更多评论
  
# re: mysql编码转换搞定[未登录] 2008-06-13 11:29 paul
这篇对bom等编码又更多解释
http://lavasp.javaeye.com/blog/103731  回复  更多评论
  
# re: mysql编码转换搞定 2008-06-13 12:59 ~上善若水~
传智播客 &amp; ajax全套独家发布

1.ajax 入门

2.ajax 原理

3.ajax 简单实例

4.ajax 无限级联动菜单

5.ajax 简易聊天室

6.ajax 开源框架简介

7.DWR 框架源码分析一

8.DWR 框架源码分析二

9.DWR 框架源码分析三

10.DWR 框架源码分析四

11.DWR框架源码分析五

12.SSH + DWR完成商城驱动

13. Extjs 简介

14 Extjs&nbsp; 简单实例

15.SSH + Extjs 开发系列之OA一

16. SSH + Extjs 开发系列之OA二

17. SSH + Extjs 开发系列之OA三

18. SSH + Extjs 开发系列之OA四

19 .SSH + Extjs 开发系列之OA五

20.&nbsp;SSH + Extjs 开发系列之OA六

21. SSH + Extjs 开发系列之OA七

22.&nbsp;SSH + Extjs 开发系列之OA八

23.SSH + Extjs 开发系列之OA九

24.SSH + Extjs 开发系列之OA十

25. ajax 前景之我见

下载地址:http://www.ibeifeng.com/read.php?tid=2338&u=5043  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: