我這邊用 Java 串連 MySQL 資料庫,通過 JDBC 寫入資料。在 Java 中直接產生的中文字串,寫入資料庫變成半形問號“?”。以下是我解決此問題的記錄。
首先,我用 Putty 這個工具串連 MySQL 以檢查中文寫入情況。這裡有一個設定。此設定如果不對,則會導致亂碼。
650) this.width=650;" border="0" alt="Putty 選擇字元編碼集操作圖" src="http://www.bkjia.com/uploads/allimg/131229/193451J04-0.png" />
然後,MySQL 提供了關於字元集的很多變數。可以通過 MySQL 命令來查看。
輸入命令:mysql> SHOW VARIABLES LIKE '%char%';
會看到如下內容:
650) this.width=650;" border="0" src="http://www.bkjia.com/uploads/allimg/131229/19345145O-1.png" alt="MySQL 查看和字元有關運行變數" />
相信大家這些變數不全是 utf8 吧?比如有的是 'utf-8' ,有的是 'latin1' 一類的?全部都改成 'utf8' 才能保持一致,不出現亂碼。
設定變數語句格式:mysql> SET character_set_server='utf8'; 將變數名一個個修改成值非 utf8 的那些,逐句執行就行。
另外除非全部系統 + 所有使用者都是純微軟環境,否則不要使用微軟推廣的 GBK 字元集,不通用。
接 下來解釋一下,為什麼不能用 UTF-8 、utf-8 一類的名稱,必須用 utf8 。大家可以看到 character_sets_dir 這個特變數。到其指定的目錄中看一下,就會發現很多字元集檔案。其中 Index.xml 是一個字元集名稱的索引檔案,裡邊有這麼一段:
650) this.width=650;" border="0" src="http://www.bkjia.com/uploads/allimg/131229/1934513351-2.png" alt="MySQL 關於字元編碼配置" />
咱們就是得讓指定的字元集名稱和這裡設定的 charset name 保持一致。這裡寫為 utf8 ,所以咱們的變數都得設為 utf8 。
通過命令設定的變數,在重啟之後會恢復原設定。所以我們可以考慮通過 my.cnf 檔案來直接配置 MySQL 的這些變數。
在 改動設定檔之前,肯定要做檔案整個的備份。這個檔案不能亂改,我實驗的結果,應該在 [client] 裡邊添加 default-character-set=utf8 ,在 [mysqld] 裡邊添加 character_set_server=utf8 ,然後保證最下邊 [mysql] 裡邊存在一個 default-character-set=utf8 。進行這種設定之後重啟 mysqld ,就不用每次開啟 MySQL 重新設定這些變數了。
---------- ---------- ---------- ----------
資料庫解決完了,接下來就是 Java 串連資料庫的問題了。
JDBC 串連時,需要提供串連的 URL 。對於 MySQL 來說,這個串連應該設定幾個參數:useUnicode=true&characterEncoding=UTF-8 。這個寫法要嚴格一致,絕不能有偏差,比如把 UTF-8 寫成 utf8 則會造成功能失常。如果沒有別的串連參數,就用 ? 引導這二個參數,否則用 & 引導。
當然了,Java 裡邊的資料本身不能內容就是亂碼。這個是另外的事情。只要保證 Java 運行時,監測變數的值本身不是亂碼,就可以保證讀寫資料庫不再是亂碼了。
本文也發表在我於 CSDN 的日誌: http://blog.csdn.net/shanelooli/article/details/7900276
ITeye 我的日誌: http://surmounting.iteye.com/blog/1660178
中國開源社區我的日誌: http://my.oschina.net/shane1984/blog/74339
本文出自 “Shane from Spads” 部落格,請務必保留此出處http://shanelooli.blog.51cto.com/5523233/971632