mysql服務器insert數據時中文亂碼或問號(java項目中insert非sql直接插入)

關於mysql中insert出現中文亂碼問題有很多,網上講的也很詳細:

這裏附上博主Sander_Hill的處理方式(轉載):https://www.cnblogs.com/houqi/p/5713176.html

 

 

-------------------------------------------------------------分割線----------------------------------------------------------------------

但是!!!!!!!

本人所有的配置全部正確找了半天還是找不到原因。於是瀏覽器F12debug了一下(原諒我當時沒想到),然後看到表單提交的方式不對,爲get方式提交,後來改爲了ajax的post方式提交,完美解決

附上get和post兩種方式提交的區別:

一:form在前臺以post方式提交數據:

    瀏覽器將數據(假設爲“中國”)發送給服務器的時候,將數據變成0101的二進制數據(假設爲98 99)時必然要查碼錶,瀏覽器以哪個碼錶打開網頁,瀏覽器就以哪個碼錶提交數據。數據到達服務器後,數據(98 99)要封裝到request中,在servlet中調用Request的getParameter方法返回的是字符串(“中國”),方法內部拿到數字後要轉成字符,一定要查碼錶,由於request的設計者是外國人,所以默認查的是他們常用的ISO8859-1,這就是請求數據產生亂碼的根源

二:form在前臺以get方式提交數據:

   get方式提交的數據依然是瀏覽器用什麼碼錶打開就用什麼碼錶發送。不同的是,以get方式提交數據時,request設置編碼無效。即使設置了UTF-8還是會去查ISO8859-1。得到(? ?),要解決這個問題,需要拿着(??)反向查ISO8859-1,拿到(98 99)後,再去查正確碼錶。

總結:

1.如果提交方式爲post,想不亂碼,只需要設置request對象的編碼即可。

      注意:客戶機數據是以哪種方式提交的,request就應該設成什麼編碼。

2.如果提交方式爲get,設置request對象的編碼是無效的,想不亂碼,只能手工轉換。

     String data = "???????";//亂碼字符串
     byte source [] = data.getBytes("iso8859-1");//得到客戶機提交的原始數據
     data = new String (data.getBytes("iso8859-1"),"UTF-8");//解決亂碼

     //等同於

    data = new String (source,"UTF-8");

3.get方式的亂碼,還可以通過更改服務器配置的方式實現。更改Tomact的conf目錄下的server.xml文件。(不推薦,因爲更好了服務器且不靈活,

這麼設置後,request的setCharacterEncoding設置什麼編碼,連接器就用什麼編碼,雖然比上一種更改靈活,但依然會導致我們的應用程序牢牢依賴於服務器,也不被推薦

4.最後的最後,提一個小細節:URL地址後面如果跟了中文數據,一定要經過URL編碼。表單提交的參數有中文數據,瀏覽器會自動幫我們編碼,但如果是通過鏈接直接帶中文參數,瀏覽器是不會幫我們編碼的,這時想通過上述第二種方式解決中文亂碼問題就時靈時不靈了,應該通過URLEncoding.encode(,"UTF-8")先編碼

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章