彻底解决mysql中文乱码

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

大家好,又见面了,我是你们的朋友全栈君。

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

1、中文乱码

1.1、中文乱码

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

这里写图片描述

insert into user value("哈哈");

无法插入中文字符:

这里写图片描述

1.2、查看表字符编码

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

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

 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范围

查看数据库编码:

show variables like '%char%';

这里写图片描述

修改字符编码:

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

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

这里写图片描述

2.2、global范围

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

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

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

2.3、设置数据全局范围

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

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

这里写图片描述

不要怕,下面就教你终极大招:

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

[mysqld]
character-set-server=utf8 [client] default-character-set=utf8 [mysql] default-character-set=utf8

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

这里写图片描述

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

这里写图片描述

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

drop database test;
create database test;
use test;
create table user(name varchar(11));
show create table user \G;

这里写图片描述

3、总结

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/143991.html原文链接:https://javaforall.net

(0)
上一篇 2022年5月11日 下午10:00
下一篇 2022年5月11日 下午10:00


相关推荐

  • asp.net 中mvc return Content(“ok”) ;return View() return JSon()区别

    asp.net 中mvc return Content(“ok”) ;return View() return JSon()区别

    2022年3月4日
    56
  • 竞赛图 哈密顿图

    竞赛图 哈密顿图竞赛图竞赛图是通过在无向完整图中为每个边缘分配方向而获得的有向图 有向图 也就是说 它是一个完整图形的方向 等价于一个有向图 其中每对不同的顶点通过单个有向边连接 即每对顶点之间都有一条边相连的有向图称为竞赛图 总的概括就是一个有向完全图 与哈密顿路径的关系任何有限数量 n 个顶点的竞赛图都包含一个哈密尔顿路径 即所有 n 个顶点上的直线路径 假设该语句适用于 n 并考虑 n 1 个顶点上的

    2026年3月17日
    2
  • 指针常量和常量指针的区别_指针常量能指向常量吗

    指针常量和常量指针的区别_指针常量能指向常量吗1、指针常量——指针类型的常量(int*constp)本质上一个常量,指针用来说明常量的类型,表示该常量是一个指针类型的常量。在指针常量中,指针自身的值是一个常量,不可改变,始终指向同一个地址。在定义的同时必须初始化。用法如下:inta=10,b=20;int*constp=&a;*p=30;//p指向的地址是一定的,但其内容可以修改2、…

    2022年4月19日
    66
  • 数据库的三大范式[通俗易懂]

    数据库的三大范式[通俗易懂]当你应聘后端岗位的时候,数据库的知识必不可少,今天给大家分享一下数据库三大范式的通俗理解第一范式:无重复的列第二范式:属性完全依赖于主键第三范式:属性不依赖于其他非主属性总结:第一范式(1NF)原子性:保证数据不可再分第二范式(2NF)前提:满足第一范式每张表只描述一件事情,就是主键对应着所有信息第三范式(3NF)前提:满足第一和第二范式第三范式需要保证表中的数据和主键直接相关,而不是间接相关注意:阿里巴巴要求关联查询的表不得超过3张,数据库的性能更加重要,适当考虑规范性就好其实目前关系数据库有六种范式:

    2025年12月9日
    5
  • 2021pycharm激活码【注册码】

    2021pycharm激活码【注册码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月17日
    39
  • java中char到底占几个字节的问题

    java中char到底占几个字节的问题前些天被问到一个问题 java 中一个 char 可以表示一个汉字吗 我一想 char 不是占一个字节吗 汉字在 utf 8 中占三个字节 还有四字节的 char 不能够表示 对方一笑 让我后面查查所以网上搜了一些资料查查 并做一个例子 publicclassB publicstatic getBytesUTF8 charc

    2026年3月17日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号