最近我的一个Spring Boot项目发布到服务器上的时候,数据库中的中文字符显示为??。在网上查找了相关资料,得知数据库乱码有很多种可能情况。下面将我自己的解决方案分享出来。
首先我的云服务器是Ubuntu Server系统。系统默认没有中文语言包。需要在系统中安装中文语言包。具体操作如下:
1.执行
sudo apt-get install language-pack-zh-hans
2.执行
lacale -a
查看系统内安装的语言环境,此时可以看到出现了zh_CN.utf8,表明语言包已经安装完成。
3.设置语言环境为UTF-8,修改配置文件。
vim ~/.profile
在其中添加
export LANG="zh_CN.UTF-8"
export LC_ALL="zh_CN.UTF-8"
然后重启服务器。调用
locale
命令,可查看到目前的环境为zh_CN.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;
我们这个项目中交互采用的JSON格式。采用jackSon进行解析,默认为UTF-8,这里不用设置。
url: jdbc:mysql://localhost/test?useUnicode=true&useSSL=false&characterEncoding=UTF-8
当我在做完上述的操作后,发现直接向数据库插入数据不会出现乱码,但是通过接口调用向数据库中插入数据依旧会有乱码问题。经过排查,发现数据库Server格式没有设置为UTF-8格式。
通过命令查看数据库编码
show variables like 'char%'
之前我的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
在MySQL 5.7以下的版本,很多博客都说的是修改my.ini文件或者my.cnf,这个我没有实验过。但在5.7版本,打开my,cnf可以看到是没有直接配置的。
引起数据库乱码问题的可能情况非常多,要进行思考,找出可能的问题点,再进行测试。确定问题,再去寻找解决方案。
https://blog.csdn.net/zhoucheng05_13/article/details/53375161