解决mysql插入中文乱码问题

时间:2022-09-11 23:07:44

先来建个表:

create table v(v char(4));
解决mysql插入中文乱码问题

插入中文:

insert into v values('中文');
显示表内容:
select *from v;
果然出现了乱码:
解决mysql插入中文乱码问题

之所以出现中文乱码其实是字符集设置不对,先来查表的全部定义:

show create table v \G;
解决mysql插入中文乱码问题

可以看到表的字符集是latin1,所以输入中文不匹配,所以出现乱码。表的字符集默认是跟数据库的字符集一样的。

再来看数据库的定义:

show create database the7 \G;

解决mysql插入中文乱码问题

可以看到数据库默认字符集也是Latin1,所以我们新建的表v的字符集默认跟数据库的字符集一样,也就是Latin1了。

那其他字符集的设置怎样呢:

输入

show variables like 'char%';

查看所有的字符配置。

解决mysql插入中文乱码问题

然后把上边的字符集全都设置成gbk,那么下次新建的表时都默认可以输入中文了

set character_set_client = gbk;
set character_set_connection = gbk;
set character_set_database = gbk;
set character_set_results = gbk;
set character_set_server = gbk;
然后设置中文校对:

set collation_connection = gbk_chinese_ci ;
set collation_database = gbk_chinese_ci ;
set collation_server = gbk_chinese_ci ;
解决mysql插入中文乱码问题
查看设置好的字符集;

show variables like 'char%';
解决mysql插入中文乱码问题
这是默认的字符集和校对都设置成中文的了,但新设置的字符集和校对只是对新的数据库和表有效。
先来新建一个新的数据库和表测试:
create database the9;
然后查看表的字符集:
show create database the9 \G;
解决mysql插入中文乱码问题
可以看见新建的数据库的字符集已经是gbk了。
使用新建的数据库:
use the9;
然后在新的数据库the9下面新建一个测试表:
create table test(c chat(4));
解决mysql插入中文乱码问题
然后插入中文:
insert into test values('中文');
select *from test;
解决mysql插入中文乱码问题
可以看到已经可以正确的输入显示中文了。
那是因为表的字符集我没有指定,默认跟数据库的字符集一样。也是gbk.
查看表的字符集:
 show create table test \G:
解决mysql插入中文乱码问题
到这里新表的的字符集都是gbk,都支持中文。
现在再来看旧数据库:
use the7;
show create database the7 \G;
解决mysql插入中文乱码问题

可以看到就得数据库the7的字符集并没有变成gbk,还是原来的latin1.
这种情况可以使用alter语句来修改字符集。
修改旧数据库the7的字符集为gbk
alter database the7 character set=gbk;
修改旧表v的字符集为gbk;
alter table v character set=gbk;
插入中文:
insert into v values('好的');
查看v表内容:
 select *from v;
解决mysql插入中文乱码问题
可以看到即使改了旧表v的字符集为gbk后,还是不能插入中文后显示还是乱码
那只能新建一个表。
然后再新建一个表vv:
create table vv(c char(4));
插入中文:
insert into vv values('中文');

显示vv表内容:
select *from vv;

解决mysql插入中文乱码问题
可以看出即使改了旧表的字符集为gbk后插入中文后还是显示乱码
只能重新建表,插入中文才不会出现乱码