乱码即字符集有问题,本篇将介绍mysql字符集及插入中文数据乱码问题的解决方式
1.mysql字符集
GBK 不是国际标准
UTF-8 中英文混合的环境,建议使用此字符集,用的比较多
Latin1 mysql的默认字符集
urf8mb4 UTF-8 Unicode
2.解决插入中文数据乱码问题
2.1)通过在库里set names解决乱码问题
2.2)为防止乱码,最好在文本文件里写好,然后执行:
在执行DQL、DML语句之前set names 系统及库表的字符集!
在SQL文件中指定set names latin1,然后登陆mysql执行如下:
mysql>source /root/test.sql
2.3)在SQL文件中指定set names latin1,然后通过mysql命令导入数据
mysql -uroot -p456 oldboy < test.sql
mysql -uroot -p456 -e "set names latin1;select * from oldboy.test;"
2.4)通过mysql命令加字符集参数导入数据解决乱码
mysql -uroot -p456 --default-character-set=latin1 oldboy < test.sql
可在mysql库外面查询情况:
mysql -uroot -p456 -e "set names latin1;select * from oldboy.test;"
2.5)在配置文件里设置客户端及服务端相关参数
更改my.cnf客户端模块的参数,可以实现set names utf8的效果,并且永久生效。
【client】客户端
default-character-set=utf8 #无需重启服务,退出重新登录就生效
【mysqld】服务端
default-character-set=utf8 #适合5.1及以前版本
character-set-server=utf8 #适合5.5 需重启才生效
【Linux系统服务端】
cat /etc/sysconfig/i18n
LANG="zh_CN.utf8"
. /etc/sysconfig/i18n 即source
提示:Linux客户端也要更改字符集(在窗口界面里更改)
2.6)也可在建立库表时限制字符集:
需找到默认的collation
create database oldboy_utf8 default character set UTF8 collate utf8_general_ci;
3.查看与字符集相关的参数
以下客户端字符集、连接字符集、数据库字符集、返回结果字符集、服务器字符集需保持统一:
mysql中执行的set names utf8其实相当于更改的client、connection和results的字符集。(临时更改)
mysql客户端增加参数default-character-set=utf8 相当于更改的client、connection和results的字符集。(临时更改)
character-set-server=uft8服务端相当于改的database、system的字符集。
【补充】关于mysql参数
show variables like '%key_buffer%'; #显示某个模糊的参数
show global status; #可以看到所有的variable_name
set global key_buffer_size=XXX ; #库中设置某参数的值
在my.cnf中加key_buffer_size= XXX;
4.对已上线的数据库数据字符集修改
对于已有的数据库修改字符集不能直接通过 "alter database character set *"或“alter table tablename character set *”,这两个都只对新创建的表或者记录生效。
以将已有的通过Latin1创建的表数据更改为utf8为例:
4.1)建库及建表的语句导出,sed批量修改为utf8
mysqldump -uroot -p --default-character-set=latin1 -d dbname>alltable.sql,编辑alltable.sql将Latin1改为utf8 # -d 表示只导表结构
4.2)确保数据库不再更新,导出所有数据
mysqldump -uroot -p --quick --no-create-info --extended-insert --default-character-set=latin1 dbname>alldata.sql
--quick:用于转储大的表,强制mysqldump从服务器一次次的检索数据而不是检索所有行,并输出前CACHE到内存中,
--no-create-info:不创建create table 语句,
--extended-insert:使用包括几个values列表的多行insert语法,这样文件更小,IO也小,导入数据时会非常快,
--default-character-set=latin1 按照原有字符集导出数据,这样导出的文件中,所有文件都是可见的,不会保存成乱码。
4.3)修改mysql服务端和客户端编码为utf8
或者打开alldata.sql将set names Latin1改为set names utf8
4.4)删除原有的库表及数据
4.5)导入新的建库及建表语句
create database dbname default charset utf8;
mysql -uroot -p dbname<alltable.sql
4.6)导入mysql的所有数据
mysql -uroot -p dbname<alldata.sql
2018年10月30日
祝好!