入门扫盲:https://www.2cto.com/database/201701/584442.html

1、修改springweb类bug

2、数据库连接配置

3、数据库字符集

https://www.cnblogs.com/chuiyuan/p/5198663.html

在将数据插入到MySQL数据库后,出现了中文乱码。

解决过程中,主要参考了下面几个文章。

字符集与字符编码

http://cenalulu.github.io/linux/character-encoding/(重点参考)

解决MySQL乱码问题

http://cenalulu.github.io/mysql/mysql-mojibake/(重点参考)

http://www.ha97.com/5359.html(重点参考)

一.字符集与字符编码

字符集规定某个文字对应的二进制数字存放方式(编码)和某串二进制数值代表了哪个文字(解码)的转换关系。

字符集只是一个规则的集合的名字,对应到真实的生活中,字符集就是对某种语言称呼,如英语,汉语。一个字符集有三个关键的元素:

字库表:所有可读或者可以显示的字符的数据库,决定了这个字符集能够展现的所有字符的范围。

编码字符集:用一个编码值(code point)来表示一个字符在字库表中的位置。

字符编码:编码字符集与实际存储数值之前的转换关系,一般来说都是将code point值作为编码后的值直接存储。如A 在ASCII的表中排第65位,而编码后的A就是65。

问题:字库表中每个字符都有一个自己的序号,直接将序号作为存储内容就可以了,为什么还要通过字符编码把序号转换成另外一种存储格式呢?

原因:统一字库表的目的是能够含有所有的字符,但是实际使用时只会使用一小部分,如中文地区不会使用日语,而一些英语国家甚至只用简单的ASCII字库表就可以了,如果把每个字符都用字库表中的序号来表示,则每个字符都要3个字节(unicode字库为例子),这种情况对原来只战胜一个字符的ASCII编码的国家显然是一个浪费。

二.UTF-8和Unicode的关系

Unicode

编码字符集,随着互联网的发展,对同一字库集的要求越来越迫切,因此出现了Unicode标准,它几乎涵盖了各个国家的语言可能出现的符号与文字,并将它们进行编号。

UTF-8

字符编码,是Unicode规则字库的一种实现形式。虽然它现在是接受度最好的一个字符集编码,但是并没有涵盖整个Unicode的字库。

三.UTF-8编码实现

下面介绍下UTF-8的编码实现,也就是它的物理存储和Unicode序号的转换关系。

UTF-8编码为变长编码,最小编码单位(code unit)为一个字节,一个字节的前1-3个bit为描述性部分,后面为实际序号部分。

  • 如果一个字节的第一位为0,那么代表当前字符为单字节字符,占用一个字节的空间。0之后的所有部分(7个bit)代表在Unicode中的序号。
  • 如果一个字节以110开头,那么代表当前字符为双字节字符,占用2个字节的空间。110之后的所有部分(5个bit)加上后一个字节的除10外的部分(6个bit)代表在Unicode中的序号。且第二个字节以10开头
  • 如果一个字节以1110开头,那么代表当前字符为三字节字符,占用2个字节的空间。110之后的所有部分(5个bit)加上后两个字节的除10外的部分(12个bit)代表在Unicode中的序号。且第二、第三个字节以10开头
  • 如果一个字节以10开头,那么代表当前字节为多字节字符的第二个字节。10之后的所有部分(6个bit)和之前的部分一同组成在Unicode中的序号。

可以看到,UTF-8字符编码是以一定方式实现了Unicode规则的字库。

四.乱码的出现

出现的原因:在编码与解码时使用了不同或者不兼容的字符集。

就如同英语的bless与法语的bless,意思不同一样,同一个汉字在UTF-8中的编码与在GBK中的编码不同,就会出现筹码。

五.MySQL出现乱码的原因

  主要分析:从客户端发起请求,到MySQL存储数据,再到下一次从表中取出数据到客户端,中间那些环节出现了编码/解码。

(1)存入MySQL的过程

1.客户端(也就是用户端)编码成二进制流。

2. MySQL Server解码。

3.Client编码向表编码转换。

详细的过程为:

  • 在terminal中使用输入法输入
  • terminal中气字符编码转换成二进制流
  • 二进制流通过MySQL客户端传输到MySQL Server
  • Server通过character-set-client解码
  • 判断character-set-client和目标表的charset是否一致
  • 如果不一致则进行一次从client-charset到table-charset的字符编码转换
  • 将转换后的字符编码二进制流保存到文件中

(2)从MySQL表中取出数据的过程

1.table-charset向character-set-client编码的转换。

2.MySQL Server根据character-set-client编码得到二进制流。

3.client解码展示。

详细过程为:

从文件读出二进制数据流

用表字符集编码进行解码

将数据转换成character-set-client的编码

使用character-set-client编码为二进制流

Server通过网络等传输到远端的client

client通过bash配置的字符编码展示结果

(3)造成MySQL乱码的原因

1.存入和取出时对应环节的编码不一致

  如在存入时,我们客户端使用的UTF-8编码,而读出时,客户端却使用的windows的GBK编码。则会出现乱码。

2.单个流程中三步的编码不一致

  上面的任意一幅图中的同方向的三步中,只有两步或者两步以上的编码有不一致,就有可能出现编码解码错误。如果不同的两个字符集之前无法进行无损编码转换,则一定会

出现乱码。如:bash 是UTF8编码,MySQL的character-set-client配置成了GBK,而表结构的编码又是charaset=utf8,则肯定会出现乱码。

(4)关于MySQL编码解码的问题

从上面的图中可以看到,系统之前是用二进制流进行传输的,那为什么不直接将这串二进制流存入表文件,而还要在存储前进行两次编解码呢?

1.Client to Server的编码解码原因是MySQL要对传来的二进制流做语法和词法解析,如果不做编码解码和校验,我们甚至不知道传输来的二进制流是insert 还是update。

2.File to Engine的编码解码是为知道二进制流内的分词情况,例如从表里面取出某个字段的前两个字符的命令:select left(col,2) from table  ,存储引擎从文件诗篇这个column的值,再按照相应的编码进行分割,不同的编码分割的结果是不一样的(有的一个字符为两字节,有的为三字符等)。因此,在从数据文件读取数据后,如果不进行编码解码的话,在存储引擎同是无法进行字符级别的操作的。

(5)如何避免乱码

从上面的分析可以看出,只要做到:客户端,MySQL character-set-client,table-charset三个字符集完全一致就可以保证不出现乱码了。

六 .Linux下修改字符集编码为UTF8,解决中文乱码问题

(1)查看当前数据库的相关编码集

可以看到,character_set_database和character_set_server的默认字符集还是latin1。

注意:

latin1是8bit 大小的字符集,latin1, ASCII,UTF8字符集的区别参考

http://blog.sina.com.cn/s/blog_5edf2a9f0100sicm.html

(2)修改mysql配置文件

  首先我们通过命令whereis找到mysql配置文件的位置。

在/etc/mysql/中找到配置文件my.cnf里说明有

因此我们将其复制到用户目录下,并修改其权限

修改配置中的字符集

在[client]里加入

default-character-set=utf8

在[mydqld]里加入

character-set-server=utf8

在[mysql]里加入

default-character-set=utf8

修改后,重启 mysql服务

sudo /etc/init.d/mysql restart

但是在我们再次使用mysql时,出现了下图中的问题

原因是之前的步骤中我们修改了.my.cnf文件的权限,mysql担心这种文件被其它用户恶意修改,所以选择了忽略,改正这个问题

再次启动,发现修改~/.my.cnf的并没有生效,先忽略这个问题,直接在/etc/mysql/my.cnf中修改,重启,查看字符集

这次正确了。

注意:暂没有发现为什么~/.my.cnf文件修改后没有起到作用。

springboot字符集乱码的更多相关文章

  1. MySQL字符集乱码详解

    对于MySQL数据库中出现乱码经常是新手碰到的一个头痛的问题,不知道为什么经常出现中文乱码. 1.对于所谓的数据库中乱码,其实这中说法是错误的,只是我们不认识服务器给我们的字符.其实还是原来的字符?那 ...

  2. mysql proxy 数据库读写分离字符集乱码

    mysql proxy 数据库读写分离字符集乱码 解决办法 在对应配置后端数据库服务器的配置.cnf中加入如下代码 init-connect='SET NAME UTF8' skip-characte ...

  3. 【转】Spring-boot 字符集设置 解决乱码方案

    使用spring-boot开发时候,有时候程序没事,往往不经意会造成中文到前端变成乱码(????这样情况) 下面给出spring-boot项目统一字符集设置方案: 1.Spring Boot修改编码方 ...

  4. MySQL2.字符集乱码

    MySQL2.字符集 此节记录下MySQL出现乱码的原因.还是参考小册子~ 字符集简介 计算机中只能存储二进制数据,建立字符与二进制数据的映射关系来存储字符. 从两方面考虑: 1.界定清楚字符范围,即 ...

  5. 常见字符集&乱码问题

    字符集 常用字符集分类 ASCII及其扩展字符集 作用:表语英语及西欧语言. 位数:ASCII是用7位表示的,能表示128个字符:其扩展使用8位表示,表示256个字符. 范围:ASCII从00到7F, ...

  6. MySQL字符集乱码

    学数据库,最让人丧气的就是字符集的问题了,一旦出问题,就会有砸电脑的冲动,特别是在修改很多次字符集后依然不成功的时候! 我用的数据库软件是MySQL 5.1.28.最初出问题的时候,是这样的: 情景一 ...

  7. 字符集乱码问题:ISO-8859-1和GBK

    问题,引用百度知道的问题吧: http://zhidao.baidu.com/question/51342167.html?qbl=relate_question_0&word=%C3%84% ...

  8. SpringBoot中文乱码解决方案

    转载:https://blog.csdn.net/wangshuang1631/article/details/70753801 方法一,修改application.properties文件 增加如下 ...

  9. mysql字符集乱码问题

    程序错误截图如下: 分析:我们mysql数据库没有设置默认编码, 导致创建的库字符集为 latin1,然而我们创建表的时候,指定字符集为其他的,比如utf8 我的解决思路:把数据库的编码修改为utf8 ...

随机推荐

  1. npm打包前端项目太慢问题分析以及暂时解决方案

    npm build 打包前端项目实际上是执行 node build/build.js,但是随着项目的依赖包越来越多,项目打包时间不断延长,为了改善这个问题,需要从node入手 暂时解决方案:扩大nod ...

  2. 1-1hibernate数据库操作基础

    一.纯原始数据库连接详见http://www.cnblogs.com/lukelook/p/7845757.html 1.Class.forName("oracle.jdbc.driver. ...

  3. Java运行时内存划分

    这篇文章可以说是摘抄自周志明的<深入理解Java虚拟机>,但是加上了自己的理解,印象可以更深些. Java虚拟机在执行Java程序的时候会把他所管理的内存划分为若干个不同的数据区域,各个区 ...

  4. Java IO流简介

    Java中的流是什么? java中的流是一个抽象的概念,在java的程序中需要把文件从一个设备传输到另一个设备上,这个设备可以是内存,程序,文件,网络.把在这些之间传输的叫做流.官方的解释:流是一组有 ...

  5. MYSQL数据库学习十四 存储过程和函数的操作

    14.1 为什么使用存储过程和函数 一个完整的操作会包含多条SQL语句,在执行过程中需要根据前面SQL语句的执行结果有选择的执行后面的SQL语句. 存储过程和函数的优点: 允许标准组件式编程,提高了S ...

  6. elementUI源码修改定制

    1.修改elementUI源码 首先从Git上克隆代码或者下载代码包 进入文件夹打开终端或Git Bash Here,运行npm install 安装依赖包.npm run dev 打开网页http: ...

  7. 【Python】随机模块random & 日期时间のtime&&datetime

    ■ random 顾名思义,random提供了python中关于模拟随机的一些方法.这些方法都一看就懂的,不多说了: random.random() 返回0<n<=1的随机实数 rando ...

  8. 【Python】 list & dict & str

    list & dict & str 这三种类型是python中最常用的几种数据类型.他们都是序列的一种 ■ 序列通用操作 1. 分片   s[a:b] 返回序列s中从s[a]到s[b- ...

  9. 关于java中的值传递与引用传递遇到的问题

    来源于:https://www.nowcoder.com/test/question/done?tid=14302398&qid=25373#summary 下列java程序的输出结果为___ ...

  10. Redis --> Redis的接口介绍及使用

    Redis的接口介绍及使用 Redis是一个远程内存数据库,它不仅性能强劲,而且还具有复制特性以及为解决问题而生的独一无二的数据模型.Redis提供了5种不同类型的数据结构,各式各样的问题都可以很自然 ...