ArthurXF从业10年的CTO,受上海非凡学院邀请,进行PHP,CSS,FREEBSD等网络技能授课培训,有意向参加的,请联系.
今天在做一个系统GBK转UTF8的编码转换,竟然发现这个系统的sql文件里的汉字都被处理成了16进制编码了。
而GBK,和UTF8的16进制编码不一致,导致根本无法在utf8下正常导入数据库。

现我肖飞为大家倾情奉献,解决办法如下:
一、在utf8的mysql下
得到中文‘游客’的gbk下的16进制编码
mysql> SELECT hex(CONVERT( '游客' USING gbk ));
      -> D3CEBFCD

反推gbk的16进制编码,取回中文
mysql> SELECT CONVERT( unhex('d3cebfcd') USING gbk);
      -> ’游客'

从gbk的16进制编码直接转成utf8的16进制编码
mysql> SELECT HEX(CONVERT(CONVERT( unhex('d3cebfcd') USING gbk) USING utf8));
      -> 'E6B8B8E5AEA2'


二、如果在gbk的mysql环境下
得到中文‘游客’的gbk下的16进制编码
mysql> SELECT hex('游客');
      -> D3CEBFCD

反推gbk的16进制编码,取回中文
mysql> unhex('d3cebfcd') ;
      -> ’游客'

原理知道了,就可以写个小程序来替换进行转编码了。不过特别提醒在文本里16进制必须在头部加上0x,例如:0xD3CEBFCD才能正常使用。
我们可能经常会碰到导出会员表中一些联系方式的数据来使用。那么可以使用下面的语句来直接导成文件。
select `FullName`,`Company`,`Address`,`ZipCode`,`Phone`,`Fax`,`Email` from tb_member order by `MemberID` desc limit 0,3000 into outfile '5217u.txt'
这个语句在phpMyAdmin中就可以执行,执行成功后,5217U.txt文件会存在你数据库的文件夹下。当然你可以指定保存路径。
例如:
select `FullName`,`Company`,`Address`,`Phone`,`Fax`,`Email` from tb_member limit 0,3000 into outfile '/user/home/mysql/tbname.txt' ;
这么保存一定切记要mysql可以有写的权限才能成功。

这个方法可以解决一些GBK和utf8在phpMyAdmin中看到乱码的数据导出。
本文肖飞倾情奉献,转载请注明出处,谢谢。
  我们公司新配置了一台服务器,使用的MYSQL5.5,当时并没考虑到会有GBK的网站放上来,本来UTF8网站都运行正常,后来有两台服务器合并,把老服务器拿回来了,老服务器上的网站全部放到新服务器上,这样就麻烦大了。老网站大量使用的是GBK版本,在新服务器上全部乱码。
  执行时还会报GBK字符集不支持的错误,查看了一下字符集,MYSQL5.5确实默认情况下不支持GBK,那只好重新装了。
  把MYSQL,deinstall后,执行make WITH_CHARSET=gbk WITH_XCHARSET=all WITH_COLLATION=gbk_chinese_ci BUILD_STATIC=yes install clean安装完成。重启后,不再报错了,但是读取出来的数据全部乱码,转成utf8浏览时正常。
  程序中加入set names gbk,仍然乱码。试了N种都没解决。
  最后把数据库拉下来,全部替换成utf8的字符集并转为utf8保存文件。上传服务器之后,程序设定set names gbk,就可以正常显示了。
  估计问题在于MYSQL5.5还是以utf8或者是我们卸载不干净,反正最底层还是以utf8为准,GBK的数据在MYSQL5.5里就是乱码,当我们转数据为UTF8的时候,MYSQL5.5认了编码,程序上设定显示按照GBK,MYSQL会自动将utf8转码为GBK显示。这样就正常了。
  我肖飞将我的经历奉贤给大家,希望大家少走弯路!
Tags: , , , ,
老版网站系统的mysql数据库dnname采用默认的latin1字符集,系统升级需要将所有数据转换成utf-8格式,目标数据库为newdbname(建库时使用utf8)

方法一:

步骤一 命令行执行:mysqldump --opt -hlocalhost -uroot -p*** --default-character-set=latin1 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语句把表结构建好,接下来开始导出-导入数据

步骤二 命令行:进入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;

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

采用第二种方法,所有数据均正常导入,且格式转换成功没有乱码
Tags: ,
1、应用程序(比如PHP)长时间的执行批量的MYSQL语句。最常见的就是采集或者新旧数据转化。
解决方案:
在my.cnf文件中添加或者修改以下两个变量:
wait_timeout=2880000
interactive_timeout = 2880000    
关于两个变量的具体说明可以google或者看官方手册。如果不能修改my.cnf,则可以在连接数据库的时候设置CLIENT_INTERACTIVE,比如:
sql = "set interactive_timeout=24*3600";
mysql_real_query(...)


2、执行一个SQL,但SQL语句过大或者语句中含有BLOB或者longblob字段。比如,图片数据的处理
解决方案:
在my.cnf文件中添加或者修改以下变量:
max_allowed_packet = 10M(也可以设置自己需要的大小)
max_allowed_packet 参数的作用是,用来控制其通信缓冲区的最大长度。
Tags: , ,
分页: 3/9 第一页 上页 1 2 3 4 5 6 7 8 9 下页 最后页 [ 显示模式: 摘要 | 列表 ]