今天做一個關於ssm的項目,數據庫用的是MySQL,但是遇到一個比較奇葩的亂碼問題,數據庫里面存的中文取出來變成了問號,存進去的中文也變成了問號,但是手動添加到數據庫中的中文取出來又是顯示正常的。一路查了很多資料,終於解決了,然后加上自己的分析,整理了一下思路。
亂碼問題出現的情況有很多種,針對web開發這一流程來說,可以根據數據的流向來定位亂碼出現的位置。前台發起一個請求,數據通過http協議到后被接收,這里數據會進行一次編碼,在ssm環境下,是springMVC來攔截請求進行處理,所以在springMVC中能配置數據的編碼格式,springMVC提供的是一個filter,在web.xml中配置。
<!-- 編碼過濾器 --> <filter> <filter-name>springfilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>springfilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
如果經springMVC攔截的中文參數沒有出現亂碼,則說明這里的編碼沒有出現問題,然后進一步去分析數據的流向。ssm的環境下是mybatis框架與數據庫進行交互,mybatis本身對數據不會進行編碼,但是在與數據庫交互的時候會有編碼的問題,比如在jdbc配置的時候,數據庫連接這里有一個編碼的參數需要配置。
driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/user?useUnicode=true&characterEncoding=UTF-8 username=root
如果以上的配置都確定沒有問題和,那么很大可能性就是數據庫亂碼了,在新建數據庫的時候需要選擇一個數據的編碼方式。
這里如果也沒有問題那就可能就我碰到的問題,數據庫存的中文變成問號。在MySQL的安裝目錄(默認在C:\Program Files\MySQL\MySQL Server 5.x)修改my.ini可以解決。mysql中文顯示亂碼或者問號是因為選用的編碼不對或者編碼不一致造成的,我是通過修改my.ini配置文件解決了中文變問號的問題。5.7之后沒有這個配置文件。
在[client]節點下添加 default-character-set=utf8
在[mysqld]節點下添加 (注:collation是排序方式)
character-set-server=utf8
collation-server=utf8_general_ci
修改完my.ini文件后,需要重啟MySQL服務,在cmd中輸入以下命令可以啟動或關閉MySQL的服務,也可以在任務管理器--->服務 中手動關閉或開啟。
關閉服務 net stop mysql
開啟服務 net start mysql
最后可以登錄MySQL看看配置是否成功。
輸入 mysql -u root -p 進入mysql數據庫,如果輸入這個命令顯示MySQL不是一個命令,需要把MySQL安裝目錄下的bin 這個路徑配到環境變量中去,就可以使用這個命令登錄MySQL。
輸入密碼:*****
show variables like 'char%'; 顯示編碼格式
如果都為utf8那就說明配置成功,再去看看亂碼問題解決了沒。