MySQL系列(三):MySQL乱码及字符集实战
MySQL插入中文数据乱码问题
MySQL数据库插入中文数据乱码
1)MySQL中添加中文数据乱码演示
1、创建一个test2测试数据库并查看建表语句
我在编译安装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;
查看表:
插入数据:
insert into student values (1,'lufei'),(2,'suolong'),(3,'namei'),(4,'wusuopu'),(5,'xiangjishu');
提示:数字和英文的数据都是正常的,不会有乱码问题。
3、在插入一条中文数据看看
MySQL命令行插入中文数据不乱码实战
1)查看建表语句,要特别注意表语句结尾的latin1
2)设置mysql客户端的字符集和建表字符集latin1一致
mysql> set names latin1; #设置字符集插入数据的表的字符集,然后再插入中文语句测试。
Query OK, 0 rows affected (0.00 sec)
3)继续插入一条中数据
这个就是mysql命令行插入数据确保不乱码的方法,如果是要更新的数据很多,就需要通过执行sql文件的方式更新数据了,那么,如果保证执行sql文件也不乱码呢?
执行sql文件插入中文数据不乱码实战
1)将要更新的多个sql语句放到文本文件里如test2.sql所示
这个步骤也是先执行set字符集操作,然后再执行更新语句,值不过是通过source加载文件执行的。
小结:DQL,DML语句之前set name系统及库表的字符集!
通过MySQL命令加字符集参数导入数据解决乱码
1)把要更新的多个sql语句放入文本文件中,注意,此处语句里面不带set names latin1;
2)通过MySQL命令加上字符集参数指定latin1字符集导入test2.sql
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
方法(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时常用的字符集有:
mysql如何选择合适的字符集
1)如果处理各种各样的文字,发布到不同语言国家地区,应选Unicode字符集,对
mysql来说就是UTF-8(每个汉字三个字节),如果应用处理英文,仅有少量汉字UTF-8更好。
2)如只需支持中文,并且数据量很大,性能要求也很高,可选GBK(定长每个汉字占双字节,英文也占双字节),如果需要大量运算,比较排序等,定长排序等,定长字符集,更快,性能高。
3)处理移动互联网业务,可能需要使用utf8mb4字符集
查看当前mysql系统支持的字符集
mysql可支持多种字符集,同一台机器,库或表的不同字段都可以指定不同的字符集。
查看mysql支持的字符集
mysql -uroot -pyjscloud -e 'show character set;'
其中,最常见的字符集为如下4种:
mysql -uroot -pyjscloud -e 'show character set;'|egrep 'gbk|utf8|latin1'|awk '{print $0}'
查看mysql当前的字符集设置情况
show variables like 'character_set%';
提示:默认情况下
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
声明:如无特别声明本文即为原创文章仅代表个人观点,版权归《废权的博客》所有,欢迎转载,转载请保留原文链接。


共有 0 条评论