MySQL 5.x處理中文全解
我這邊用 Java 連接 MySQL 數據庫,通過 JDBC 寫入數據。在 Java 中直接生成的中文字符串,寫入數據庫變成半角問號“?”。以下是我解決此問題的記錄。
首先,我用 Putty 這個工具連接 MySQL 以檢查中文寫入情況。這裡有一個設置。此設置如果不對,則會導致亂碼。
然後,MySQL 提供了關於字符集的很多變量。可以通過 MySQL 命令來查看。
輸入命令:mysql> SHOW VARIABLES LIKE '%char%';
會看到如下內容: www.2cto.com
相信大家這些變量不全是 utf8 吧?比如有的是 'utf-8' ,有的是 'latin1' 一類的?全部都改成 'utf8' 才能保持一致,不出現亂碼。
設置變量語句格式:mysql> SET character_set_server='utf8'; 將變量名一個個修改成值非 utf8 的那些,逐句執行就行。
另外除非全部系統 + 所有用戶都是純微軟環境,否則不要使用微軟推廣的 GBK 字符集,不通用。
接下來解釋一下,為什麼不能用 UTF-8 、utf-8 一類的名稱,必須用 utf8 。大家可以看到 character_sets_dir 這個特變量。到其指定的目錄中看一下,就會發現很多字符集文件。其中 Index.xml 是一個字符集名稱的索引文件,裡邊有這麼一段:
咱們就是得讓指定的字符集名稱和這裡設定的 charset name 保持一致。這裡寫為 utf8 ,所以咱們的變量都得設為 utf8 。
通過命令設置的變量,在重啟之後會恢復原設置。所以我們可以考慮通過 my.cnf 文件來直接配置 MySQL 的這些變量。
在改動配置文件之前,肯定要做文件整個的備份。這個文件不能亂改,我試驗的結果,應該在 [client] 裡邊添加 default-character-set=utf8 ,在 [mysqld] 裡邊添加 character_set_server=utf8 ,然後保證最下邊 [mysql] 裡邊存在一個 default-character-set=utf8 。進行這種設定之後重啟 mysqld ,就不用每次開啟 MySQL 重新設定這些變量了。
www.2cto.com
---------- ---------- ---------- ----------
數據庫解決完了,接下來就是 Java 連接數據庫的問題了。
JDBC 連接時,需要提供連接的 URL 。對於 MySQL 來說,這個連接應該設定幾個參數:useUnicode=true&characterEncoding=UTF-8 。這個寫法要嚴格一致,絕不能有偏差,比如把 UTF-8 寫成 utf8 則會造成功能失常。如果沒有別的連接參數,就用 ? 引導這二個參數,否則用 & 引導。
當然了,Java 裡邊的數據本身不能內容就是亂碼。這個是另外的事情。只要保證 Java 運行時,監測變量的值本身不是亂碼,就可以保證讀寫數據庫不再是亂碼了。