當我們做項目時,從瀏覽器讀取數據到mysql時出現了中文亂碼應該如何解決?
一、分析問題出現的原因
首先我們要分析可能出現問題的地方,從瀏覽器發送數據到數據庫一共要經歷三次字符傳輸。
- 瀏覽器發送請求給servlet。
- servlet通過連接池發送給mysql。
- mysql存儲時的字符設置。
因此處理字符問題應從這三個方面去考慮
二、解決方案
首先,先看一下自己mysql數據庫的編碼格式
1.1 查看字符編碼
mysql> show create table user \G;
*************************** 1. row ***************************
Table: user Create Table: CREATE TABLE `user` (
`name` varchar(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 1 row in set (0.00 sec)
我們可以看到表的默認字符集是latin1. 所以我們在創建表的時候就需要指定表的字符集:
create table user(name varchar(11)) default charset=utf8;
1.2 查看數據庫編碼:
show variables like '%char%';
修改字符編碼:
set character_set_server=utf8;
set character_set_database=utf8;
show variables like '%char%';
如果問題沒有解決就修改連接池的設置
在druid.properties裏將原來的
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///travel
username=root
password=admin
initialSize=5
maxActive=10
maxWait=3000
改成
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///travel?useSSL=false&characterEncoding=utf-8&autoReconnect=true
username=root
password=admin
initialSize=5
maxActive=10
maxWait=3000
即在url後面加個characterEncoding=utf-8。
最後查看瀏覽器的請求是否設置爲了utf-8編碼傳輸
用如下代碼,設置request的編碼格式爲utf-8。
request.setCharacterEncoding("utf-8");
至此所有mysql可能出現編碼錯誤的問題都解決了。