雲伺服器資料庫亂碼問題解決方案
問題
最近我的一個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可以看到是沒有直接配置的。
總結
引起資料庫亂碼問題的可能情況非常多,要進行思考,找出可能的問題點,再進行測試。確定問題,再去尋找解決方案。