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

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

时间:2025-01-12 09:35:47浏览次数:1  
标签:utf8 SET character 数据库 字符集 乱码 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,数据库,字符集,乱码,set,MySQL
From: https://www.cnblogs.com/ataoxz/p/18666605

相关文章

  • MySQL can't opet file(errno:24)
    有的时候,数据库跑得好好的,突然报不能打开数据库文件的错误了。解决思路:首先我们要先查看数据库的errorlog。然后判断是表损坏,还是权限问题。还有可能磁盘空间不足导致的不能正常访问表,操作系统的限制也要关注下,相关应用限制也要关注下;123#ulimit-n查看系统的......
  • MySQL 中删除重复数据 SQL 写法
    要在MySQL中删除重复的数据并只保留一条,可以使用下面的方法(要用的时候直接复制小改下条件和表名称即即可)方法一:使用leftjoin+子查询删除重复数据(推荐)温馨提示:本人在500w数据下执行此SQL耗费15s-30s左右使用leftjoin(推荐方法删除重复数据,添加唯一组......
  • MySQL练习2
    1.单表查询(1)素材表名:worker--表中字段均为中文,比如“部门号,工资,职工号,参加工作”等(2)创建worker表CREATETABLEworker (部门号 int(11) NOT NULL, 职工号 int(11) NOT NULL, 工作时间 date NOT NULL, 工资 float(8,2) NOT NULL, 政......
  • Mysql--重点篇--索引(索引分类,Hash和B-tree索引,聚簇和非聚簇索引,回表查询,覆盖索引,索引
    索引是数据库中用于加速查询操作的重要机制。通过索引,MySQL可以快速定位到满足查询条件的数据行,而不需要扫描整个表。合理的索引设计可以显著提高查询性能,但不合理的索引可能会导致性能下降和磁盘空间浪费。因此,理解索引的工作原理、类型以及如何优化索引非常重要。一、索......
  • 基于ssm四S店预约保养系统,附源码+数据库+论文+开题+任务书,包安装调试
    1、项目介绍基于ssm的四S店预约保养系统,分为用户、管理员用户-功能:登录、注册、个人中心、车辆信息管理、公告信息管理、预约保养管理管理员-功能:登录、首页、个人中心、管理员管理、车辆信息管理、基础数据管理、公告信息管理、用户管理、约保养管理2、技术框架运行系统:W......
  • 基于ssm学生资助管理系统,附源码+数据库+论文+开题+任务书+PPT,包安装调试
    1、项目介绍图4.1即为设计的管理员功能结构,管理员权限操作的功能包括审核学生的家庭经济信息,对家庭经济的证明文件进行下载查看,可以管理学生监护人信息,管理公告,管理资助名单信息以及管理学生信息等。图4.2即为设计的学生功能结构,学生权限操作的功能包括登记家庭经济信息,上......
  • 在数据库中如何存储以太坊地址?
    1.SQL数据库存储以太坊地址SQL数据库支持多种数据类型,其中VARCHAR和CHAR是存储字符串的常见选择。由于以太坊地址有固定的42个字符(包括0x前缀),我们可以根据需求选择合适的存储方式。VARCHAR(42):以太坊地址的长度是固定的42个字符,因此可以使用VARCHAR(42)来存......
  • GORM 默认行为与数据库迁移:自动处理 id 字段的自增属性
    1.GORM默认行为:自动处理id字段自增在大多数数据库中,id字段通常作为表的主键,而且经常被设计为自增字段。在使用GORM时,默认情况下,GORM会自动将int类型的id字段作为自增主键处理。即使你没有显式地声明该字段为AUTO_INCREMENT,GORM也会在创建表时自动为其添加该属性......
  • 如何安全地修改网站数据库中的数据?
    直接操作数据库可以快速更新大量数据,但也存在风险。确保操作的安全性和准确性非常重要。解决方案:备份数据库:在进行任何修改之前,务必创建完整的数据库备份。使用管理工具:利用数据库管理工具(如phpMyAdmin)进行操作,避免手动编写SQL语句带来的错误。测试查询:在执行修改前,先在一个......
  • Apache AGE:基于PostgreSQL的图数据库深度解析
    ApacheAGE:基于PostgreSQL的图数据库深度解析一、引言在当今复杂多变的数据环境中,关系型数据库和图数据库各自扮演着重要的角色。关系型数据库以其结构清晰、查询高效的特点,在事务处理和数据一致性方面表现出色;而图数据库则以其灵活的数据模型和强大的图查询能力,在社交网......