mysql字符集&插入中文数据乱码问题

乱码即字符集有问题,本篇将介绍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日

祝好!

 

posted @ 2018-09-19 16:10  时光浅夏wk  阅读(1449)  评论(0编辑  收藏  举报