今天在V2EX上問了下遇到的mysql數據庫中文亂碼的問題,先說下,V2EX比CSDN論壇的模塊好多了,一個小時的點擊量就突破了500次,而且也有很多人幫助回答。
然後下面是我問的問題:
---------------------------------------------------------
項目全程都是utf8,hibernte寫進數據庫的數據取出來在myeclipse的consle下面顯示是正常的,為何在數據庫那個dos窗口下面顯示的中文名就是亂碼。注明:我的數據庫所有配置都是utf8
然後我又試著手動在dos窗口下用insert語句插入中文,結果是error1406,插不進去,再查看用程序插進去的中文顯示亂碼。之後的解決方法:我把my.ini文件中的兩處配置改為GBK,然後dos窗口下顯示出了正確的中文,我想問的是既然數據庫是utf8編碼,為何GBK可以把中文讀出來,utf8就不行,是不是dos窗口中不支持utf8的顯示,所以中文亂碼?
----------------------------------------------------------
想了一下,差不多應該就是DOS窗口的顯示問題了,現在用數據庫就用圖形化來管理操作了,如果要用命令提示符操作的話,就只能先set names gbk;然後不用了就輸入一句set names utf8;之所以這麼切換是因為我想保持所有的都為utf8方式,避免可能出現的麻煩,這應該就是目前的解決辦法吧。
MySQL命令行輸入“SET NAMES UTF8;”
面那句等於:
SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8
mysql中的運行模式為
信息輸入路徑:client→connection→server;
信息輸出路徑:server→connection→results。
換句話說,以出現亂碼的輸出為例,server裡utf8的數據,傳入connection,傳入results依舊為utf8,dos窗口把results轉過來。如果兩種字符集不兼容,比如gbk和utf8,轉化過程就為不可逆的,破壞性的,所以會出線亂碼。
再來看不出現亂碼的情況,每個路徑要經過3次改變字符集編碼。server裡utf8的數據,傳入connection轉為gbk,傳入results,編碼方式依舊為GBK,DOS窗口把results轉過來,dos默認是GBK編碼方式,這就是相同的了,就不會出現亂碼。
所以我之前總是error1406,插入不進包含中文的sql語句,也就是這個道理。
另外,我的數據庫編碼方式,我在創建的時候就設定為了utf8了,所以我的數據庫的編碼方式為utf8,那麼我其他的工具讀取的時候就不會有錯。
這就是為什麼每次一亂碼,輸入一句set names gbk(對於dos窗口),或者輸入一句set names utf8(對於頁面等以utf8編碼的東西),亂碼就消失了的原因吧。
當然了set names GBK;關掉數據庫再重啟的話就有恢復成原來的了,不過這也無所謂了,以後差不多都用圖形化的管理工具了吧,也不太會用到dos窗口,等自己以後的技術成熟了,有了幾年的經驗以後,就用linux的開發環境吧。
----------------------------------------------------------------------------------
今天學到關於數據庫的其他知識:
查看當前數據庫編碼格式:
show variables like 'character_set_database';
查看字符編碼
show variables like 'character%';
設置服務器的編碼方式
set character_set_server=utf8
varchar和nvarchar的區別在於varchar是character字符nvarchar是Unicode字符串,前者不支持中文,後者支持中文
mysql中schema的具體意思
http://blog.csdn.net/kimsoft/article/details/4627520
mysql的1406錯誤就是由於上述的編碼方式不一樣造成的。