兩個解決方案:
1、修改服務端的mysql設定文件,編輯my.cnf文件,在[mysqld]下新增一行character_set_server = utf8,然後重新啟動mysql服務
2、使用jdbc連線時,指定正確的編碼,jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8
查閱官方文檔,jdbc連接資料庫時,會先查詢服務端的character_set_server值,再確定連線時所使用的編碼。若要覆寫客戶端的自動偵測編碼功能,可以使用characterEncoding屬性
文件位址:https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-reference-charsets .html
#先查看下MYSQL的字元集
解釋下這幾個參數:
character_set_client:客戶端來源資料使用的字元集
character_set_connection:連接層字元集
character_set_database:目前選取資料庫的預設字元集
character_set_filesystem:把os上檔案名稱轉換成此字元集,預設binary是不做任何轉換的
character_set_results:查詢結果字元集
character_set_server:預設的內部操作字元集
character_set_system:系統元資料字元集
character_sets_dir:字元集的路徑
#修改服務端的mysql設定文件,編輯my.cnf文件,在[mysqld]下方新增一行character_set_server = utf8,然後重新啟動mysql服務,再去查詢字元集:
然後了解下字元集轉換流程:
插入資料:
服務端將資料由客戶端(character_set_client)字元集轉成character_set_connection,然後將character_set_connection字元集轉成對應的字元集儲存到磁碟中,這個對應的字元集會依照下列優先順序來判斷:
1、建立表格時設定的字元集
2、建立庫時所設定的字元集
3、character_set_database字元集
4、character_set_server字元集
查詢資料:
服務端將資料由儲存在磁碟中的字元集,轉換成character_set_results字元集,傳回給客戶端
然後分析下
#1、jdbc不設定characterEncoding=utf8,服務端character_set_server為latin1,jdbc以latin1字元集連接資料庫,資料庫服務端將latin1轉成utf8然後儲存到磁碟(因為character_set_connection和建立表指定的字元集都是utf8),這時就造成了亂碼
2、jdbc不設定characterEncoding=utf8,服務端character_set_server為utf8,或是jdbc設定characterEncoding=utf8,jdbc都以utf8字元集連接資料庫,資料庫服務端以utf8儲存至磁碟,這時資料就是正常的
以上是Java中jdbc連接資料庫出現中文亂碼問題的解決方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!