1. 程式人生 > >雲伺服器資料庫亂碼問題解決方案

雲伺服器資料庫亂碼問題解決方案

問題

最近我的一個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。
此時伺服器可以支援中文。

設定資料庫為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%'

資料庫編碼
之前我的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可以看到是沒有直接配置的。

總結

引起資料庫亂碼問題的可能情況非常多,要進行思考,找出可能的問題點,再進行測試。確定問題,再去尋找解決方案。

參考