[实践OK]如何把早期bo-blog里latin1的MYSQL编码转换为全utf8编码格式。

jackxiang 2014-7-14 15:54 | |
背景:很久前用bo-blog时的编码是latin编码,但里面存的是utf8格式,出现啥问题?当时是放在虚拟域名机上没有ssh,每次备份出来都是乱码,找bob呢,说是得用帝国备份进行导出,会有自动编码识别功能,确实有这个功能,给我后呢,我通过帝国备份王导入自己的本机vmware机器上的mysql版本是Mysql 5.6.13正常,导入到外网vps机器上的mysql 5.6.19上不正常,显示乱码,于是否,我觉得是编码问题了,对照发现,果然不一样,高版本的mysql默认就全是utf8的:
一)内网vmware测试机上的编码情况(mysql 5.6.13):
mysql> show variables like "%char%";
+--------------------------+----------------------------------+
| Variable_name            | Value                     |
+--------------------------+----------------------------------+
| character_set_client     | latin1                    |
| character_set_connection | latin1                |
| character_set_database   | utf8                   |
| character_set_filesystem | binary                  |
| character_set_results    | latin1                    |
| character_set_server     | latin1                   |
| character_set_system     | latin1                  |
| character_sets_dir       | /usr/local/mysql/share/charsets/ |
+--------------------------+----------------------------------+
二)Vps的最新版本的mysql如下(mysql 5.6.19):
mysql> show variables like "%char%";
+--------------------------+----------------------------------+
| Variable_name            | Value                     |
+--------------------------+----------------------------------+
| character_set_client     | utf8                      |
| character_set_connection | utf8                  |
| character_set_database   | utf8                   |
| character_set_filesystem | binary                  |
| character_set_results    | utf8                      |
| character_set_server     | utf8                     |
| character_set_system     | utf8                    |
| character_sets_dir       | /usr/local/mysql/share/charsets/ |
+--------------------------+----------------------------------+
方案一:
目前,对导入正常显示正常的mysql 5.6.13作如下编码规范,操作如下:(-d 表示只导出表结构,不导出数据。 -t是只导出结构。)
1> 以latin1导出表结构和数据(也有分开导出,对latin1作替换其中表结构定义中的字符集为新的字符集utf8):
步骤如下:
(1)这儿一定要是latin1的,否则导出来的是乱码,加入mysqldump参数如下:
sed -i s/CHARSET=latin1/CHARSET=utf8/g `grep -rl "CHARSET=latin1" justwinitData22.sql `
(2)对第1步里export出来里面的表结构定义中的字符集由latin1替换为新的字符集utf8:
/usr/local/webserver/mysql/bin/mysqldump -uroot  --default-character-set=latin1  --no-create-info justwinit_mysql  > justwinitData22.sql

2>使用新的字符集创建新的数据库并导入(导入前得转成utf8格式,editplus或UltraEdit把justwinitData22.sql 另存为utf8格式):
create database justwinit_mysql  default charset utf8;

3>确保在vps高版本导入前的sql里加入一行:set names utf8。(我发现这一行直接在sql的terminal里写再source好像不行,以前好像行的,还得写到sql文本里。)
source /tmp/justwinit/justwinitData22.sql
mysql> source /tmp/justwinit/justwinitData22.sql

导入完毕,中文访问就不乱码了,也就Ok了。EOF
参考:
http://blog.chinaunix.net/uid-25266990-id-3344584.html

方案二:
当然,也可以直接select into,后再load 进去:
步骤一 将待导出的数据表的表结构导出(可以用Phpmyadmin、mysqldump等,很简单就不说了),然后将导出的create table语句的CHARSET=latin1改为CHARSET=utf8,在目标库newdbname中执行该create table语句把表结构建好,接下来开始导出-导入数据
步骤二 命令行:进入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://www.2cto.com/database/201102/84121.html

相关中文乱码及文件编码转换成utf8的工具技巧介绍,附录:
(1)中文在linux上用vi和less查看乱码的设置:
在Linux上看utf8的文件,一个是SecureCRT高架,一个是vim的设置::set fileencoding=utf-8。
想用less命令查看的时候,就先执行这个命令,然后再用less查看:
export LESSCHARSET=latin1
这样用less查看的大部分都没问题了,但是存在某些行太长自动换行后乱码的情况。这是因为每个汉字由多个字节组成,在行尾被截断了,下一行都有问题,你需要手工调整一下客户端的宽度就可以了。

想用VI查看的时候,在打开文本之后的VI里进行如下设置:
:set encoding=utf-8 termencoding=latin1
注意那个encoding是要查看文本的编码格式,一般就是服务器默认编码。
摘自:http://www.myexception.cn/linux-unix/1662792.html

(2)linux下如何做编码转换成utf8的办法:
wget http://pkgs.repoforge.org/enca/enca-1.10-1.el6.rf.x86_64.rpm
enca -L zh_CN -x UTF-8 file   #将file转换成utf8的编码格式 也能转成utf8格式:enca-1.10-1.el6.rf.x86_64。
enca的用法:
enca -L zh_CN file    #查看file的编码格式
enca -L zh_CN -x UTF-8 file   #将file转换成utf8的编码格式
enca -L zh_CN -x UTF-8 file1 file2   #转换之后存成file2文件,不覆盖file1
不过用的时候发现有一部分文件无法传转,具体原因不祥,不过enca会把无法转换的文件告诉你的。对于这些不能转的文件,可以用gedit另存为的方式转,虽然这法笨点,但挺好使的。(上面我就是通过editplus别存为转的,UltraEdit也成。)
实践如下:
[root@jackxiang justwinit]# enca -L zh_CN  justwinitData22.sql
Universal transformation format 8 bits; UTF-8
  Surrounded by/intermixed with non-text data
[root@jackxiang justwinit]# enca -L zh_CN  justwinitData21.sql  
Universal transformation format 8 bits; UTF-8

enca实践内容来自:http://zhan.renren.com/itbegin?gid=3602888498000703772&checked=true

作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:http://jackxiang.com/post/7324/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!


最后编辑: jackxiang 编辑于2014-7-14 16:38
评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]