問(wèn)題描述
在前端輸入一段中文存入mysql中,發(fā)現(xiàn)mysql中的顯示是??
矛盾點(diǎn)
在前端發(fā)請(qǐng)求的時(shí)候設(shè)置了字符編碼為utf-8(utf8:用以解決國(guó)際上不同語(yǔ)言而出現(xiàn)的編碼),但為什么數(shù)據(jù)庫(kù)中卻接受不到中文。。。
問(wèn)題解決
Q1:首先判斷下問(wèn)題可能在哪?
我們?cè)谙騧ysql 寫入中文數(shù)據(jù)時(shí),在客戶端(前端,后端的java程序)、數(shù)據(jù)庫(kù)連接、寫入數(shù)據(jù)庫(kù)時(shí)分別要進(jìn)行編碼轉(zhuǎn)換;寫入數(shù)據(jù)庫(kù)后,在返回結(jié)果、數(shù)據(jù)庫(kù)連接、客戶端((前端,后端的java程序))分別進(jìn)行編碼轉(zhuǎn)換。從問(wèn)題的描述中我們知道問(wèn)題在寫入數(shù)據(jù)庫(kù)的過(guò)程中。。。
Q2: 雖然在發(fā)請(qǐng)求的時(shí)候設(shè)置了字符編碼為utf-8,但還是不放心,懷疑問(wèn)題可能會(huì)出在前端。
A2: 用postman進(jìn)行了測(cè)試,發(fā)送post請(qǐng)求,傳入的數(shù)據(jù)為中文,去數(shù)據(jù)庫(kù)查看,發(fā)現(xiàn)還是???
,雖然這不能說(shuō)明前端是沒(méi)有問(wèn)題的,但證明了后端一定有問(wèn)題。
Q3: 是SpringBoot 的問(wèn)題嗎?
A3: 在網(wǎng)上嘗試了很多辦法,試圖將SpringBoot 的字符編碼設(shè)置為utf-8,后來(lái)發(fā)現(xiàn)SpringBoot 的默認(rèn)編碼方式就是utf-8.....
Q4:那么問(wèn)題在哪里?
A4: 現(xiàn)在需要排查數(shù)據(jù)庫(kù)了。使用show variables like 'character_set_%'
來(lái)查看數(shù)據(jù)庫(kù)的編碼格式。
設(shè)置下數(shù)據(jù)庫(kù)連接時(shí)的字符編碼,怎么設(shè)置?不知道.....google 搜索,在jdbc 連接mysql的時(shí)候設(shè)置,在springBoot 中application.properties中添加如下代碼:
spring.datasource.url=jdbc:mysql://localhost:13308/GrowthNoteList?useUnicode=true&characterEncoding=utf-8
設(shè)置后用上述命令查詢?nèi)缦拢?/p>
上述結(jié)果顯示的是mysql 數(shù)據(jù)庫(kù)系統(tǒng)中客戶端、數(shù)據(jù)庫(kù)連接、數(shù)據(jù)庫(kù)、文件系統(tǒng)、查詢結(jié)果、服務(wù)器、系統(tǒng)的字符集設(shè)置及mysql的字符設(shè)置目錄。
在這里,文件系統(tǒng)字符集是固定的,系統(tǒng)、服務(wù)器的字符集在安裝時(shí)確定,與亂碼問(wèn)題無(wú)關(guān),亂碼的問(wèn)題與客戶端、數(shù)據(jù)庫(kù)連接、數(shù)據(jù)庫(kù)、查詢結(jié)果的字符集設(shè)置有關(guān)。(注:客戶端是看訪問(wèn)mysql 數(shù)據(jù)庫(kù)的方式,通過(guò)命令行訪問(wèn),命令行窗口就是客戶端,通過(guò)JDBC 等連接訪問(wèn),程序就是客戶端。)
再次用postman測(cè)試,發(fā)現(xiàn)可以存入中文了,問(wèn)題解決。
結(jié)論:jdbc連接數(shù)據(jù)庫(kù)的時(shí)候字符編碼需要設(shè)置成utf-8
反思
開(kāi)始的時(shí)候沒(méi)有想到數(shù)據(jù)庫(kù),主管懷疑是springBoot,就從網(wǎng)上找設(shè)置SpringBoot字符編碼的方式,然后各種嘗試,浪費(fèi)了很多時(shí)間。。。
action
當(dāng)陷入問(wèn)題,一時(shí)解決不了時(shí)用tasking圖幫助理清思路,找出可能出現(xiàn)問(wèn)題的點(diǎn),不能陷入問(wèn)題,在google上盲目的搜索,會(huì)浪費(fèi)很多時(shí)間的。