mysql資料庫修改字元編碼問題
轉自:海綿般汲取
https://www.cnblogs.com/gne-hwz/p/8748028.html
遇到這種情況,現有專案的資料庫已經建好,資料表也已經建立完成。
問題來的,資料庫不能插入中文,除錯時候發現中文資料從傳送請求到最後請求處理完成這些步驟,中文還沒有發生亂碼。
只有在儲存到資料庫後查詢資料並顯示才會亂碼。
那麼到此可以確定是mysql出現問題了。
那麼應該怎麼辦呢?哈哈,當然是看我們的度娘啦!
看的下度娘解決方法是:
將資料庫的編碼修改為utf8編碼格式,因為安裝mysql預設使用的字元編碼latin1
what?這個編碼是什麼鬼,見都沒見過。
查了下,Latin1是ISO-8859-1的別名。因為ISO-8859-1編碼範圍使用了單位元組內的所有空間,在支援ISO-8859-1的系統中傳輸和儲存其他任何編碼的位元組流都不會被拋棄
這個latin1編碼是單位元組編碼,而一般漢字是需要兩個位元組儲存,所以這個編碼格式不支援漢字。
接下來就看怎麼改吧
資料庫字元優先順序有:系統級、資料庫級、表級、欄位。這5個優先順序中欄位優先順序最高。舉個列子。我們要向表中儲存中文資料。如果表的字元編碼是utf8,而欄位的字元編碼是latin1。那麼如果我們儲存中文還是會出現亂碼,因為使用的編碼是欄位的字元編碼latin1
在資料庫建立時如果不設定資料庫的預設字元編碼,即預設時會使用系統的字元編碼latin1。建立表預設時使用資料庫的字元編碼,欄位同理。
從上面可以得出一個重要結論,建立資料庫時一定要指定預設字元編碼!
1、
首先我們檢視mysql資料庫伺服器,客戶端,資料庫連線,檔案系統等的字元編碼
show variables like ‘%char%’;
±-------------------------±------------------------------------±-----
| Variable_name | Value |…
±-------------------------±------------------------------------±-----
| character_set_client | utf8 |… – 客戶端字符集
| character_set_connection | utf8 |…
| character_set_database | latin1|… – 資料庫字符集
| character_set_filesystem | binary |…
| character_set_results | utf8 |…
| character_set_server | latin1|… – 伺服器字符集
| character_set_system | utf8 |…
| character_sets_dir | D:\MySQL Server 5.0\share\charsets\ |…
±-------------------------±------------------------------------±-----
預設安裝完mysql資料庫時,伺服器和資料庫使用的編碼是latinn1編碼格式。
這個上面沒有問題,可以先不用考慮
網上看到很多人要修改這個系統級的字元編碼,我也不知道什麼原因,改完之後中文亂碼問題就得到解決了
2、
檢視資料庫的建立語句。以預設的資料庫mysql為例
show create database mysql
可以發現其的default character set預設字元編碼格式是latin1。由此可以看出,預設時會自動使用latin1
所以我們需要在建立資料庫時指定預設的編碼格式
create database 資料庫名 CHARACTER SET utf8 COLLATE utf8_general_ci;
修改已建立的資料庫的編碼
alter database 資料庫表名 CHARACTER SET utf8 COLLATE utf8_general_ci;
3、
檢視資料庫中匹配到的表的編碼格式。
show table status from 資料庫名 like ‘pattern/匹配模式’;
檢視資料庫中所有表的編碼格式
show table status from mysql like ‘%%’;
4、
修改表的預設編碼格式。有兩種方法
alter table 表名 character set utf8 COLLATE utf8_general_ci;
alter table 表名 convert to character set utf8;
第一種是僅僅修改表的字元編碼,而欄位的字元編碼還是latin1編碼格式,這種改變沒有意義
可以檢視資料表中所有列的字元編碼,就可以發現欄位的字元編碼是否發生改變。
show full columns from 表名;
第二種會將表和欄位的編碼都更改為utf8編碼格式。
5、
中文亂碼問題得到解決的,但是資料庫裡那麼多表,我們總不可能一個表一個表的進行修改吧,所以我們要使用儲存過程,
加動態sql語句的方式使用迴圈自動修改資料庫內的所有資料表的編碼格式。
注意:如果修改完後中文儲存還是亂碼。將連線資料庫的連線後面指定編碼格式為utf8
如果還是不行,那麼將mysql預設的字元編碼進行修改,即下面的characterEncoding
jdbcUrl = jdbc:mysql://主機域名:3306/資料庫名?characterEncoding=utf8&useSSL=false&useUnicode=true
useSSL:與伺服器進行通訊時使用SSL,預設值為“假
參考主要引數,表資料來源Mysql JDBC Url引數說明