首页 > 数据库 >MySQL出现乱码怎么解决

MySQL出现乱码怎么解决

时间:2025-01-15 09:54:20浏览次数:1  
标签:utf8 set character mysql 字符集 乱码 SET MySQL 解决

为什么我的数据库总会出现中文乱码的情况。一堆中文乱码不知道怎么回事?当向数据库中写入创建表,并插入中文时,会出现这种问题。此报错会涉及数据库字符集的问题。

.1 解决乱码的几个方面

对于中文乱码的情况,从三个方面

  • 数据终端: 就是我们连接数据库的工具设置为utf8
  • 操作系统层面:linux 系统通过 在命令争端查看当前编码echo $LANG或者locale

如何修改了系统编码了:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 # centos 6.x 版本是/etc/sysconfig/i18n 修改这个文件 shell> vim /etc/sysconfig/i18n # 这一行改为utf8 LANG=en_US.UTF-8 # 修改完,不要重启,立即生效如下 shell> source /etc/sysconfig/i18n     # centos 7.x 版本是/etc/locale.conf 这个文件 [root@mysql-150 ~]# vim /etc/locale.conf LANG="en_US.UTF-8" #立即生效 [root@mysql-150 ~]# source /etc/locale.conf

  

  • 数据库层面:

在参数文件中的[mysqld] 下,加入相应utf8字符集

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 # 注意数据库的系统版本 5.6.x 和 5.7.x设置字符集参数不一样,8.x和5.7.x设置是一样的 #查看当前数据库的字符集参数,查看当前字符集参数 mysql> show variables like '%character%';   # 查看数据库支持的字符编码,和编码的排序规则 mysql> show character set;   # 修改sutdents表中sname 字段的字符编码 mysql> alter table students modify sname varchar(66) character set gbk; Query OK, 3 rows affected (0.06 sec) Records: 3  Duplicates: 0  Warnings: 0   #看看表结构 mysql> show create table students; ... | students | CREATE TABLE `students` (   `sid` int(11) NOT NULL,   `sname` varchar(66) CHARACTER SET gbk DEFAULT NULL,   `sex` int(11) DEFAULT NULL,   PRIMARY KEY (`sid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 | ...   # 查看连接级字符集和排序规则 mysql> show variables like '%collation%'; +----------------------+-----------------+ | Variable_name        | Value           | +----------------------+-----------------+ | collation_connection | utf8_general_ci | | collation_database   | utf8_general_ci | | collation_server     | utf8_general_ci | +----------------------+-----------------+

  

从上面示例可以得出:

如果修改数据库字符集,需要从以下考

  • 列级别字符集

  • 表级别字符集

  • 库级别字符集

  • mysql 实例字符集

2 怎么合理修改mysql字符集了

在/etc/my.cnf 加一下参数

1 2 3 4 5 6 7 8 9 10 11 vim /etc/my.cnf [mysqld] init-connect='SET NAMES utf8' character-set-server=utf8 然后去数据库操作: mysql> set @@global.character_set_server=utf8; Query OK, 0 rows affected (0.00 sec)   mysql> set @@global.init_connect='SET NAMES utf8'; Query OK, 0 rows affected (0.00 sec) # 注 用户操作的时候看看有没有super权限,对super用户权限 set names 不生效

  

有人说,修改完还是乱码, 这时候就乱码是哪个库的字符集,哪个表的字符集,哪个字段的字符集,还有操作系统字符集,程序连接的字符集,这些都的查看。

在/etc/my.cnf中init-connect='SET NAMES utf8'是什么意思:

让每个客户端连接都自动设置字符集,但缺点是对拥有super权限的用户不生效

init_connect表示服务器为每个连接的客户端执行的字符串。字符串由一个或多个SQL语句组成。要想指定多个语句,用分号间隔开 。

 比如:

1 2 3 4 5 6 # 举例init_connect mysql> SET @@GLOBAL.init_connect='SET AUTOCOMMIT=0;set names utf8'; shell> vim my.cnf [mysqld] init_connect='SET AUTOCOMMIT=0;set names utf8'

3 连接级字符集和排序规则

  • 每个数据库客户端连接都有自己的字符集和排序规则属性,

    客户端发送的语句的字符集是由character_set_client决定,

    而与服务端交互时会根据character_set_connection和collation_connection两个参数将接收到的语句转化。当涉及到显示字符串的比较时,由collation_connection参数决定,

    而当比较的是字段里的字符串时则根据字段本身的排序规则决定

  • character_set_result参数决定了语句的执行结果以什么字符集返回给客户端

  • 客户端可以很方便的调整字符集和排序规则,比如使用SET NAMES 'charset_name' [COLLATE 'collation_name']表明后续的语句都以该字符集格式传送给服务端,而执行结果也以此字符集格式返回。

  

set names 字符集

1 2 3 4 set names charset_name 语句相当于执行了以下三行语句: SET character_set_client = charset_name; SET character_set_results = charset_name; SET character_set_connection = charset_name;

  

或者执行SET CHARACTER SET 'charset_name'命令 :此命令和set names非常类似,唯一不同是将connection的字符集设置为当前数据库的字符集,所以相当于执行以下三行语句:

1 2 3 SET character_set_client = charset_name; SET character_set_results = charset_name; SET character_set_connection = @@character_set_database;

小结: 中文乱码从:数据终端,操作系统,数据库

数据库从: 全局数据库server字符集——>数据库字符集——> 表字符集——> 列字符集

4 表情乱码不能识别

修改存表情字段的字符集为utf8mb4  

标签:utf8,set,character,mysql,字符集,乱码,SET,MySQL,解决
From: https://www.cnblogs.com/gdjgs/p/18672320

相关文章

  • 遇到overflow: scroll不能平滑滚动怎么解决?
    overflow:scroll这个CSS属性允许内容在容器内滚动,但是它本身并不提供平滑滚动的功能。如果你想要实现平滑滚动的效果,你可能需要使用其他方法。以下是一些可能的解决方案:1.使用CSS的scroll-behavior属性你可以使用CSS的scroll-behavior属性来设置滚动行为。将其设置......
  • 在实际编写css中你有遇到过哪些浏览器兼容性的问题?怎么解决的?
    在实际编写CSS过程中,我遇到过多种浏览器兼容性问题。以下是一些常见问题及其解决方法:不同浏览器对CSS属性的支持差异:某些CSS属性(如flexbox布局、grid布局、CSS变量等)在新版浏览器中得到良好支持,但在旧版浏览器或某些特定浏览器中可能不支持或存在bug。解决方法:使用CanIuse......
  • 嵌入式杂谈(问题解决一:使用HAL库时keil中代码的分区)
     如图,代码分区代码区域作用Privateincludes引入所需头文件,提供函数声明、类型定义和宏等Privatetypedef创建自定义数据类型,增强代码可读性与维护性Privatedefine定义常量和宏,方便代码修改与简化Privatemacro实现简单代码替换,简化代码逻辑Privatevariables声明和初始化......
  • 解决 IDEA 编译报错:Error:(2048,1024) java: 找不到符号
    摘要在使用IntelliJIDEA开发Java项目时,“找不到符号”(Cannotfindsymbol)是一种常见的编译错误。本文将从初学者的角度,详细分析这一问题的可能原因,提供排查步骤,并附上代码示例,帮助你快速解决问题。引言“找不到符号”是Java编译器的一种错误提示,通常发生在......
  • 【Varnish】:解决 Varnish 7.6 CDN 静态资源缓存失效问题
    项目场景:在一个使用Varnish作为反向代理的Web应用中,我们依赖CDN(内容分发网络)来缓存静态资源(如图片、CSS、JavaScript文件等),以提高全球用户的访问速度并减轻源站服务器的负载。然而,在实际运行中,我们遇到了一个问题:CDN缓存的静态资源全部一直回源,导致源站服务器负载过高,响应时间......
  • ryujin 1.2.78下载(龙神模拟器),配置19.0的key和对应固件,解决amiibo API错误(需要翻墙vpn)
    1.下载不废话Release1.2.78·Ryubing/Ryujinx·GitHub,找对应的版本下载下载后解压得到publish文件夹,打开里面的Ryujinx.exe,会报错,别管先挂着,接着看步骤22.配置switch的key和固件推荐(不用vpn):下面步骤2.1和2.2 key和固件的下载要使用vpn,你可以直接用夸克打开下面......
  • 【MySQL】简单解析一条SQL查询语句的执行过程
    1.MySQL的逻辑架构图MySQL架构主要分为Server层和存储引擎层。Server层集成了连接器、查询缓存、分析器、优化器和执行器等核心组件,负责提供诸如日期、时间、数学和加密等内置函数,以及实现存储过程、触发器、视图等跨存储引擎的功能。存储引擎层则负责数据的实际存......
  • MYSQL学习笔记(一):准备数据和数据库的最基本命令
    前言:学习和使用数据库可以说是程序员必须具备能力,这里将更新关于MYSQL的使用讲解,大概应该会更新30篇+,涵盖入门、进阶、高级(一些原理分析);这一篇是入门准备数据和一些关于数据库的操作命令;虽然MYSQL命令很多,但是自己去多敲一点,到后面忘记了,查一下就可以回忆起来使用了;这......
  • pyqt+mysql实现学生学籍管理系统(带.sql和.ui文件)
    所有文件已经上传至https://github.com/shuimqy/Student-Information-Management-System-implemented-with-Qt.git需要的话可自行下载,自己写的数据库大作业,尽量不要照搬提交。如果对你有帮助的话,点个赞吧,有问题欢迎留言!下面是我的涉及过程即设计报告。需求分析概念结构......
  • 中科大提出新视频流制作动画解决方案RAIN,可实现真人表情移植和动漫实时动画。
    中科大提出了一种新的视频流制作动画解决方案RAIN,能够使用单个RTX4090GPU实时低延迟地为无限视频流制作动画。RAIN的核心思想是有效地计算不同噪声水平和长时间间隔的帧标记注意力,同时对比以前基于流的方法多得多的帧标记进行去噪。这种设计允许RAIN生成具有更短延迟和更......