MySQL 插入 中文數據亂碼解決

問題描述:mysql

一、在命令行中進行插入,沒有問題。可是顯示存在部分亂碼sql

 

二、在JDBC中插入成功、中文是直接以「??」形式顯示。數據庫

經過Navicat客戶端查看服務器

與在網頁中看到的一一致,說明讀取沒有問題,問題定位在寫入數據或存儲數據的編碼有問題。編碼

解決方案:spa

當向 MySQL 數據庫插入一條帶有中文的數據形如 insert into employee values(null,'張三','female','1995-10-08','2015-11-12','Sales',2000,'是個好員工!'); 出現亂碼時,使用語句 show variables like 'character%'; 來查看當前數據庫的相關編碼集。命令行

能夠看到 MySQL 有六處使用了字符集,分別爲:client connectiondatabaseresultsserver system。其中與服務器端相關:databaseserversystem(永遠沒法修改,就是utf-8);與客戶端相關:connectionclientresults 。保證每一項的編碼統一就不會產生亂碼,固然支持中文的話也能夠改爲gbkgb2312utf-8等,建議是utf-8。在mysql中默認字符集是latin1,他是不支持中文的3d

 

clientserver

爲客戶端使用的字符集。blog

connection

爲鏈接數據庫的字符集設置類型,若是程序沒有指明鏈接數據庫使用的字符集類型則按照服務器端默認的字符集設置。

database

爲數據庫服務器中某個庫使用的字符集設定,若是建庫時沒有指明,將使用服務器安裝時指定的字符集設置。

results

爲數據庫給客戶端返回時使用的字符集設定,若是沒有指明,使用服務器默認的字符集。

server

爲服務器安裝時指定的默認字符集設定。

system

爲數據庫系統使用的字符集設定。

與客戶端相關:connectionclientresults 。字符集能夠經過set names utf8; 或者 set names gbk;進行修改數據庫的編碼集。

設置完成後便可解決客戶端插入數據或顯示數據的亂碼問題了,但咱們立刻會發現這種形式的設置只會在當前窗口有效,當窗口關閉後從新打開 CMD 客戶端的時候又會出現亂碼問題;那麼,如何進行一個一勞永逸的設置呢?在 MySQL 的安裝目錄下有一個 my.ini 配置文件(Linux下是/etc/my.cnf),經過修改這個配置文件能夠一勞永逸的解決亂碼問題。在這個配置文件中 [mysql] 與客戶端配置相關,[mysqld] 與服務器配置相關。默認配置以下:

  • [mysql]
  • default-character-set=utf8
  • [mysqld]
  • character-set-server=utf8

修改完成後,我重啓了Linux,主要的server 已經改成utf8了。

 

設置後,從JDBC進行增長的數據、顯示出來沒有問題了。

tip:不一樣MySQL版本修改設置項還不一樣:

5.1版本時,爲了解決中文亂碼問題設置默認字符集爲utf8時,是寫:

default-character-set=utf8

到了5.5版本, [mysql] 項內能夠這麼寫, [mysqld] 項內這麼寫在啓動MySQL服務時會有1067錯誤,經查詢發現這裏必需要這樣寫:

character-set-server=utf8

 

 

 

set names 命令其餘試探:

 

 

當使用了set names gbk後使用insert後出現亂碼,而默認寫入編碼格式是utf8,因此直接就進行寫入沒有問題。

得出結論:server編碼是數據庫最終存儲數據的編碼格式,而set names命令只修改了寫入數據時的數據編碼格式。

相關文章
相關標籤/搜索