MySQL中文亂碼處理方法

MYSQL數據庫默認語言爲瑞典語, 現有一GB2312字符的數據庫.
結構OK. 爲什麼內容是亂碼? 不重裝數據庫有辦法解決碼?

從MySQL 4.1開始引入的多語言支持確實很棒,而且一些特性已經超過了其他的數據庫系統。不過我在測試過程中發現使用適用於MySQL 4.1之前的PHP語句操作MySQL數據庫會造成亂碼,即使是設置過了表字符集也是如此。我讀了一下新的MySQL在線手冊中第十章"Character Set Support"後終於找到了解決方法並測試通過。

MySQL 4.1的字符集支持(Character Set Support)有兩個方面:字符集(Character set)和排序方式(Collation)。對於字符集的支持細化到四個層次: 服務器(server),數據庫(database),數據表(table)和連接(connection)。

 

查看系統的字符集和排序方式的設定可以通過下面的兩條命令:

mysql> SHOW VARIABLES LIKE 'character_set_%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
7 rows in set (0.00 sec)

mysql> SHOW VARIABLES LIKE 'collation_%';
+----------------------+-------------------+
| Variable_name | Value |
+----------------------+-------------------+
| collation_connection | latin1_swedish_ci |
| collation_database | latin1_swedish_ci |
| collation_server | latin1_swedish_ci |
+----------------------+-------------------+
3 rows in set (0.00 sec)

 

上面列出的值就是系統的默認值。(很奇怪系統怎麼默認是latin1的瑞典語排序方式)...

當我們按照原來的方式通過PHP存取MySQL數據庫時,就算設置了表的默認字符集爲utf8並且通過UTF-8編碼發送查詢,你會發現存入數據庫的仍然是亂碼。問題就出在這個connection連接層上。解決方法是在發送查詢前執行一下下面這句:

SET NAMES 'GBK';
它相當於下面的三句指令:
SET character_set_client = GBK;
SET character_set_results = GBK;
SET character_set_connection = GBK;

 

一定要執行了上面的語句SET NAMES 'GBK';之後再建立數據庫。

 

JSP文件第一行必須是:<%@ page language="java" contentType="text/html; charset=GBK" pageEncoding="GBK"%>

 

連接MySQL時的url必須有:url= "jdbc:mysql://localhost/bbs?user=root&password=tpfpcwl&useUnicode=true&characterEncoding=utf-8";

發佈了32 篇原創文章 · 獲贊 2 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章