MySQL 插入 中文数据乱码解决

Wesley13
• 阅读 690

问题描述:

1、在命令行中进行插入,没有问题。但是显示存在部分乱码

 MySQL 插入 中文数据乱码解决

MySQL 插入 中文数据乱码解决

2、在JDBC中插入成功、中文是直接以“??”形式显示。

MySQL 插入 中文数据乱码解决

通过Navicat客户端查看

MySQL 插入 中文数据乱码解决

与在网页中看到的一一致,说明读取没有问题,问题定位在****写入数据或存储数据的编码有问题。

解决方案:

当向 MySQL 数据库插入一条带有中文的数据形如 insert into employee values(null,'张三','female','1995-10-08','2015-11-12','Sales',2000,'是个好员工!'); 出现乱码时,使用语句 show variables like 'character%'; 来查看当前数据库的相关编码集。

MySQL 插入 中文数据乱码解决

可以看到 MySQL 有六处使用了字符集,分别为:client 、connection、database、results、server 、system。其中与服务器端相关:database、server、system(永远无法修改,就是utf-8);与客户端相关:connection、client、results 。保证每一项的编码统一就不会产生乱码,当然支持中文的话也可以改成gbk,gb2312,utf-8等,建议是utf-8。在mysql中默认字符集是latin1,他是不支持中文的

client

为客户端使用的字符集。

connection

为连接数据库的字符集设置类型,如果程序没有指明连接数据库使用的字符集类型则按照服务器端默认的字符集设置。

database

为数据库服务器中某个库使用的字符集设定,如果建库时没有指明,将使用服务器安装时指定的字符集设置。

results

为数据库给客户端返回时使用的字符集设定,如果没有指明,使用服务器默认的字符集。

server

为服务器安装时指定的默认字符集设定。

system

为数据库系统使用的字符集设定。

与客户端相关:connection、client、results 。字符集可以通过set names utf8; 或者 set names gbk;进行修改数据库的编码集。

设置完成后即可解决客户端插入数据或显示数据的乱码问题了,但我们马上会发现这种形式的设置只会在当前窗口有效,当窗口关闭后重新打开 CMD 客户端的时候又会出现乱码问题;那么,如何进行一个一劳永逸的设置呢?在 MySQL 的安装目录下有一个 my.ini 配置文件(Linux下是/etc/my.cnf),通过修改这个配置文件可以一劳永逸的解决乱码问题。在这个配置文件中 [mysql] 与客户端配置相关,[mysqld] 与服务器配置相关。默认配置如下:

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

MySQL 插入 中文数据乱码解决

修改完成后,我重启了Linux,主要的server 已经改为utf8了。

 MySQL 插入 中文数据乱码解决

设置后,从JDBC进行增加的数据、显示出来没有问题了。

tip:不同MySQL版本修改设置项还不同:

在5.1版本时,为了解决中文乱码问题设置默认字符集为utf8时,是写:

default-character-set=utf8

到了5.5版本, [mysql] 项内可以这么写, [mysqld] 项内这么写在启动MySQL服务时会有1067错误,经查询发现这里必须要这样写:

character-set-server=utf8

set names 命令其他试探:

 MySQL 插入 中文数据乱码解决

当使用了set names gbk后使用insert后出现乱码,而默认写入编码格式是utf8,所以直接就进行写入没有问题。

得出结论:server编码是数据库最终存储数据的编码格式,而set names命令只修改了写入数据时的数据编码格式。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
7个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
美凌格栋栋酱 美凌格栋栋酱
1个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(