[实践OK]如何把早期bo-blog里latin1的MYSQL编码转换为全utf8编码_MySQL
一)内网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.bitsCN.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
上一篇: 直播平台发礼物与弹幕,消息服务器是怎么确认是当前登录用户发的消息?
下一篇: php上传图片解决方法