天天看點

jdbc連接配接資料庫,中文出現亂碼的問題

jdbc連接配接資料庫,中文出現亂碼的問題

一、使用jdbc連接配接資料庫,插入資料庫時,資料裡的資料顯示亂碼,為 " ??? "

兩種解決方案:

1、修改服務端的mysql配置檔案,編輯my.cnf檔案,在[mysqld]下添加一行character_set_server = utf8,然後重新開機mysql服務

2、使用jdbc連接配接時,指定正确的編碼,jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8

二、為什麼配置了character_set_server = utf8,jdbc連接配接時就可以不指定編碼

查閱官方文檔,jdbc在連接配接資料庫時,會先查詢服務端的character_set_server值,再确定連接配接時使用的編碼。要想覆寫用戶端的自動檢測編碼功能,可以使用characterEncoding屬性

文檔位址:https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-reference-charsets.html

三、MYSQL的字元處理機制是怎樣的,為什麼jdbc不指定編碼或者服務端不設定character_set_server=utf8會導緻亂碼

先檢視下MYSQL的字元集

jdbc連接配接資料庫,中文出現亂碼的問題

解釋下這幾個參數:

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服務,再去查詢字元集:

jdbc連接配接資料庫,中文出現亂碼的問題

然後了解下字元集轉換流程:

插入資料:

服務端将資料由用戶端(character_set_client)字元集轉成character_set_connection,然後将character_set_connection字元集轉成相應的字元集存儲到磁盤中,這個相應的字元集會按照以下優先級來判斷:

1、建立表時設定的字元集

2、建立庫時設定的字元集

3、character_set_database字元集

3、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存儲到磁盤,這時資料就是正常的

發表于 2019-03-27 20:07 hongdongjian 閱讀(...) 評論(...) 編輯 收藏

重新整理評論重新整理頁面傳回頂部

繼續閱讀