Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 472|回复: 0

解决mysql中文乱码问题?

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-4-17 19:32:13 | 显示全部楼层 |阅读模式

    mysql是我们项目中非常常用的数据型数据库。但是因为我们需要在数据库保存中文字符,所以经常遇到数据库乱码情况。下面就来介绍一下如何彻底解决数据库中文乱码情况。

    1、中文乱码

    1.1、中文乱码

    1  create table user(name varchar(11));    # 创建user表
    2  insert into table user("carl");         # 添加数据
    3  select * from user;

    1 insert into user value("哈哈");

    1.2、查看表字符编码

     1 mysql> show create table user \G;
     2 *************************** 1. row ***************************
     3        Table: user
     4 Create Table: CREATE TABLE `user` (
     5   `name` varchar(11) DEFAULT NULL
     6 ) ENGINE=InnoDB DEFAULT CHARSET=latin1
     7 1 row in set (0.00 sec)

    我们可以看到表的默认字符集是latin1. 
    所以我们在创建表的时候就需要指定表的字符集:

    1  create table user(name varchar(11)) default charset=utf8; 

    这样在Linux里面可以访问并且可以插入与访问这个表了。

    1.3、数据库与操作系统编码

    虽然在服务器端可以显示中文正常,但是在客户端可能会显示乱码。因为我们的服务器是UTF8。

    这里写图片描述

    而且数据库的编码也存在问题。

    这里写图片描述

    这里我们可以看character_sert_database与character_set_server的字符集都是latin1.那么在mysql数据库中,server,database,table的字符集都默认是latin1.下面我们就来看看如何解决mysql乱码情况。

    2、mysql设置变量的范围

    2.1、session范围

    查看数据库编码:

    1 show variables like '%char%';

    这里写图片描述

    修改字符编码:

    1 set character_set_server=utf8;
    2 set character_set_database=utf8;
    3 show variables like '%char%';

    这里写图片描述
    我们可以看到字符集已经修改成都是utf8了。但是这里有一个问题,那就是我们重新打开一个命令窗口然后查看数据编码就会出现下面的画面:

    这里写图片描述

    2.2、global范围

    mysql设置变量的范围默认是session范围。如果设置多个会话的字符集那么需要设置global范围:Set [global|session] variables …

    1 set global character_set_database=utf8;
    2 set global character_set_server=utf8;
    3 show variables like '%char%';

    当我们跨会话查看mysql字符集都会看到都是utf8。如果你以为万事大吉了的话,那么你就大错特错了。

    2.3、设置数据全局范围

    当我们数据库重启的时候,你们发现设置global范围的值又变成latin1了。

    1 service mysqld restart
    2 mysql -uroot -pyourpassword
    3 show variables like '%char%';

    这里写图片描述

    修改mysql配置文件/etc/my.cnf。

    1 [mysqld]
    2 character-set-server=utf8 
    3 [client]
    4 default-character-set=utf8 
    5 [mysql]
    6 default-character-set=utf8

    请注意这几个参数配置的位置,不然可能会启动不起来mysql服务:

    这里写图片描述

    OK。这下如果你重启mysql服务也会发现它的字符集是utf8.

    这里写图片描述

    而且我们创建表的时候不需要指定字符编码,它默认就是utf8;

    1 drop database test;
    2 create database test;
    3 use test;
    4 create table user(name varchar(11));
    5 show create table user \G;

    这里写图片描述

    3、总结

    我看网上很多答案都是直接在session级别设置mysql的字符编码,这是治标不治本的方法。我们还是要从源头上解决这个问题。那就是修改mysql默认的配置文件,把它的字符集修改成能够使用中文字符的UTF8就OK了。

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-12-22 22:49 , Processed in 0.059163 second(s), 30 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表