云服务器数据库乱码问题解决方案

问题

最近我的一个Spring Boot项目发布到服务器上的时候,数据库中的中文字符显示为??。在网上查找了相关资料,得知数据库乱码有很多种可能情况。下面将我自己的解决方案分享出来。

解决方法

服务器支持中文

首先我的云服务器是Ubuntu Server系统。系统默认没有中文语言包。需要在系统中安装中文语言包。具体操作如下:
1.执行

sudo apt-get install language-pack-zh-hans

2.执行

lacale -a

查看系统内安装的语言环境,此时可以看到出现了zh_CN.utf8,表明语言包已经安装完成。
云服务器数据库乱码问题解决方案_第1张图片
3.设置语言环境为UTF-8,修改配置文件。

vim ~/.profile

在其中添加

export LANG="zh_CN.UTF-8"
export LC_ALL="zh_CN.UTF-8"

然后重启服务器。调用

locale

命令,可查看到目前的环境为zh_CN.UTF-8。
此时服务器可以支持中文。

设置数据库为UTF-8

这一步在数据库建立表的时候设置charset=utf8。例如:

      CREATE TABLE IF NOT EXISTS `class` (
      `cno` bigint(20) NOT NULL COMMENT '班级编号',
      `cname` varchar(25) NOT NULL COMMENT '班级名',
      `cid` bigint(20) NOT NULL COMMENT '教师编号',
      `courseid` bigint(20) NOT NULL COMMENT '课程号',
      PRIMARY KEY (`cno`),
      UNIQUE KEY `cno` (`cno`),
      KEY `courseId` (`courseid`),
      KEY `cId` (`cid`),
      CONSTRAINT `class_ibfk_1` FOREIGN KEY (`courseid`) REFERENCES `course` (`id`),
      CONSTRAINT `class_ibfk_2` FOREIGN KEY (`cid`) REFERENCES `user` (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

关键点为最后要设置CHARSET=utf8;

服务端与客户端交互数据格式要设置为UTF-8

我们这个项目中交互采用的JSON格式。采用jackSon进行解析,默认为UTF-8,这里不用设置。

JPA连接要设置为UTF-8格式

这里写图片描述

    url: jdbc:mysql://localhost/test?useUnicode=true&useSSL=false&characterEncoding=UTF-8

数据库Server要设置为UTF-8格式

当我在做完上述的操作后,发现直接向数据库插入数据不会出现乱码,但是通过接口调用向数据库中插入数据依旧会有乱码问题。经过排查,发现数据库Server格式没有设置为UTF-8格式。
通过命令查看数据库编码

show variables like 'char%'

云服务器数据库乱码问题解决方案_第2张图片
之前我的character_set_server为latin1,才对导致上述的问题。通过命令可以修改字符集

set character_set_database=utf8;  
set character_set_server=utf8;  

不过这样修改的话,当重启数据库就会失效。可以采用修改配置文件的方式来保证一次修改(以下内容基于MySQL 5.7)。
修改路径/etc/mysql/mysql.conf.d/下修改mysqld.cnf文件。
在文件中[mysqld]标签下添加character-set-server=utf8
云服务器数据库乱码问题解决方案_第3张图片
在MySQL 5.7以下的版本,很多博客都说的是修改my.ini文件或者my.cnf,这个我没有实验过。但在5.7版本,打开my,cnf可以看到是没有直接配置的。

总结

引起数据库乱码问题的可能情况非常多,要进行思考,找出可能的问题点,再进行测试。确定问题,再去寻找解决方案。

参考

https://blog.csdn.net/zhoucheng05_13/article/details/53375161

你可能感兴趣的:(数据库)