MySQL系列(三):MySQL乱码及字符集实战

MySQL插入中文数据乱码问题

MySQL数据库插入中文数据乱码

1)MySQL中添加中文数据乱码演示

1、创建一个test2测试数据库并查看建表语句

m-63

我在编译安装mysql的时候已经指定了utf8为默认字符集,这里创建数据库字符集就是utf8,为了下面演示乱码问题,建表时我指定latin1为字符集

2、在test2库下创建一个student表,并查看表结构和建表语句。

create table student(     
id int(4) not null auto_increment,           
name char(20) not null, 
primary key(id) 
)ENGINE=InnoDB DEFAULT CHARSET=latin1;

m-64

查看表:

m-65

插入数据:

insert into student values (1,'lufei'),(2,'suolong'),(3,'namei'),(4,'wusuopu'),(5,'xiangjishu');

提示:数字和英文的数据都是正常的,不会有乱码问题。

3、在插入一条中文数据看看

m-66

MySQL命令行插入中文数据不乱码实战

1)查看建表语句,要特别注意表语句结尾的latin1

m-67

2)设置mysql客户端的字符集和建表字符集latin1一致

mysql> set names latin1;    #设置字符集插入数据的表的字符集,然后再插入中文语句测试。
Query OK, 0 rows affected (0.00 sec)

3)继续插入一条中数据

m-68

这个就是mysql命令行插入数据确保不乱码的方法,如果是要更新的数据很多,就需要通过执行sql文件的方式更新数据了,那么,如果保证执行sql文件也不乱码呢?

执行sql文件插入中文数据不乱码实战

1)将要更新的多个sql语句放到文本文件里如test2.sql所示

m-69

这个步骤也是先执行set字符集操作,然后再执行更新语句,值不过是通过source加载文件执行的。

小结:DQL,DML语句之前set name系统及库表的字符集!

通过MySQL命令加字符集参数导入数据解决乱码

1)把要更新的多个sql语句放入文本文件中,注意,此处语句里面不带set names latin1;

m-70

2)通过MySQL命令加上字符集参数指定latin1字符集导入test2.sql

m-71

MySQL插入中文不乱码5种方法小结

方法(1):登陆mysql,先做“set names latin1;”,然后再执行更新语句或执行语句文件。

mysql> set names latin1;   
Query OK, 0 rows affected (0.00 sec)

mysql> source test2.sql; 
Query OK, 1 rows affected (0.00 sec)

方法(2):在sql文件中指定set names latin1;然后登陆mysql,通过如下命令执行。

mysql> source test2.sql; 
Query OK, 1 rows affected (0.00 sec)

方法(3):在sql文件中指定set names latin1;然后通过mysql命令导入数据

[root@mysql-1]# mysql -uroot -pyjscloud test2 < test2.sql
[root@mysql-1]# mysql -uroot -pyjscloud test2 -e 'set names latin1;select * from test2.student'

方法(4):通过指定mysql命令的字符集参数实现--default-character-set=latin1 test2 <test2.sql

m-72

方法(5):在配置文件里设置客服端及服务端相关参数

更改my.cnf客服端模块的参数,可以实现set names latin1的效果,并且永久生效。

[client]
default=character-set=latin1

提示:无需重启服务,退出重新登录就生效,相当与set names latin1;

更改服务端字符集简单的办法

更改my.cnf参数

[mysqld]
default-character-set=latin1 #适合5.1以以及前版本
default-set-server=latin1  #适合5.5

不乱码的思想

处理好:linux,客服端,服务端,库,表,程序!

1)linux系统

cat /etc/locale.conf
LANG="zh_CN.utf8"

2)MySQL客服端

临时:

set names utf8

永久:

更改my.cnf客服端模块的参数,可以实现set names utf8的效果,并且永久生效。

[client]
default-character-set=latin1

3)MySQL服务端

更改my.cnf参数

[mysqld]
default-character-set=latin1 #适合5.1以以及前版本
default-set-server=latin1  #适合5.5

4)MySQL库表

create database test3 default character set utf8 collate utf8_general_ci;

create table student(     
id int(4) not null auto_increment,           
name char(20) not null, 
primary key(id) 
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

需要了解的内容:
show variables与show global status;参考博客

mysql数据库字符集知识

mysql数据库字符集介绍

简单地说,字符集就是一套文字符号及其编码、比较规则的集合,第一个计算机字符集ASC2!
mysql数据库字符集包括字符集(CHARCTER)和校对规则(COLLATION)两个概念,其中,字符集是用来定义mysql数据字符串的存储方式。而校对规则则是定义比较字符串的方式。在上面命令查看已建立的test2库的语句中,CHARATER SET latin1即为数据库字符集,而COLLATE latin1_swedish_ci为校对规则。

mysql数据库常见字符集介绍

在互联网环境中,使用mysql时常用的字符集有:

m-73

mysql如何选择合适的字符集

1)如果处理各种各样的文字,发布到不同语言国家地区,应选Unicode字符集,对
mysql来说就是UTF-8(每个汉字三个字节),如果应用处理英文,仅有少量汉字UTF-8更好。

2)如只需支持中文,并且数据量很大,性能要求也很高,可选GBK(定长每个汉字占双字节,英文也占双字节),如果需要大量运算,比较排序等,定长排序等,定长字符集,更快,性能高。

3)处理移动互联网业务,可能需要使用utf8mb4字符集

查看当前mysql系统支持的字符集

mysql可支持多种字符集,同一台机器,库或表的不同字段都可以指定不同的字符集。
查看mysql支持的字符集

mysql -uroot -pyjscloud -e 'show character set;'

m-74

其中,最常见的字符集为如下4种:

mysql -uroot -pyjscloud -e 'show character set;'|egrep 'gbk|utf8|latin1'|awk '{print $0}'

m-75

查看mysql当前的字符集设置情况

show variables like 'character_set%';

m-76

提示:默认情况下

character_set_client,character_set_connection,character_set_results三者的字符集和系统的字符集一致即可

不同字符集参数的含义:

| character_set_client     | utf8           #客服端字符集
| character_set_connection | utf8      #连接字符集
| character_set_database   | utf8       #数据库字符集,配置文件指定或建库表指定
| character_set_results    | utf8         #返回结果字符集    
| character_set_server     | utf8          #服务器字符集,配置文件指定或建库建表指定

如何更改生产MYSQL数据库库表的字符集

数据字符集修改步骤

对于已有的数据库想修改字符集不能直接通过“alter database character set *” 或 “alter table tablename set *” ,这两个命令都没有更新已有记录的字符集,而只是对新创建的表或者记录生效。已经有记录的字符的调整,必须先将数据导出,经过修改字符集后重新导入后才可以完成。修改数据库默认编码:

alter database [your db name] charset [your character setting]

模拟latin1字符集的数据库修改成GBK字符集的实际过程。

1)导出表结构

mysqldump -uroot -pyjscloud --default-character-set=latin1 -d test2 > alltable.sql --default-character-set=gbk

表示已GBK字符集进行连接 -d 只导表结构

2)编辑alltable.sql将latin1改成GBK

3)确保数据库不再更新,导出所有数据

mysqldump -uroot -pyjscloud --quick --no-create-info --extended-insert --default-character-set=latin1 test2 > alldata.sql

参数说明:

--quick:用于转储大的表,强制mysqldump从服务器一次一行的检索数据而不是检索所有行,并输出前CACHE到内存中。

--no-create-info:不创建CRATE TABLE语句。

--extended--insert:使用包括几个VALUES列表的多行INSERT语法,这样文件更小,IO也小,导入数据时会非常快

--default-character-set=latin1按照原有字符集导出数据,这样导出的文件中,所有中文都是可见,不会保存成乱码。

4)打开allsdata.sql将set names latin1修改成set names gbk;(或者修改系统的服务端和客户端)

5)建库

create database test3 default charset gbk;

6)创建表,执行alltable.sql

mysql -uroot -pyjscloud test3

7)导入数据

mysql -uroot -pyjscloud test3

注意:选择目标字符集时,要注意最好大于源字符集(字库更大),否则可能会丢失不被支持的数据

总结:latin1->utf8

1、建库及建表的语句导出,sed批量修改为utf8

2、导出所有mysql数据

3、修改mysql服务端和客户端编码为utf8

4、删除原有的库表及数据

5、导入新的建库及建表的语句

6、导入mysql的所有数据

|| 版权声明
作者:废权
链接:https://blog.yjscloud.com/archives/69
声明:如无特别声明本文即为原创文章仅代表个人观点,版权归《废权的博客》所有,欢迎转载,转载请保留原文链接。
THE END
分享
二维码
MySQL系列(三):MySQL乱码及字符集实战
MySQL插入中文数据乱码问题 MySQL数据库插入中文数据乱码 1)MySQL中添加中文数据乱码演示 1、创建一个test2测试数据库并查看建表语句 我在编译安装mysql的时……
<<上一篇
下一篇>>
文章目录
关闭
目 录