Mysql中文亂碼

Mysql中文亂碼

 

網站程序是asp.net(c#),連接出現中文亂碼,主機分配給用戶一個帳號,可以使用phpMyAdmin操作Mysql,

Mysql的信息如下,

運行:SHOW VARIABLES LIKE 'character_set_%';
Variable_name Value
character_set_client utf8
character_set_connection utf8
character_set_database utf8
character_set_filesystem binary
character_set_results utf8
character_set_server latin1
character_set_system utf8
character_sets_dir D:/mysql/share/charsets/

運行SHOW VARIABLES LIKE 'collation_%';
Variable_name Value
collation_connection utf8_general_ci
collation_database utf8_general_ci
collation_server latin1_swedish_ci

在網站web.config裏,已經配置了:
<globalization requestEncoding="utf-8" resp fileEncoding="utf-8"/>

但是讀寫數據庫仍然是亂碼,非常頭疼!

在phpMyAdmin裏面的SQL操作頁面裏面直接輸入INSERT語句,中文能正確插入,爲什麼在程序裏就不行呢?

我在自己的機子上調試的時候,是可以正常運行的,但Mysql配置有所不同,就是
character_set_server和collation_server都utf8格式,難道是這個問題?
 
 
歷經多日的麻煩終於沒有了,原來對Mysql失望極了,現在問題解決了,看法也改觀,對當初選擇C#+Mysql的設計方法,現在想想還是相當不錯的.

說正題,問題解決了,我把解決的方法寫一下,希望對大家有所幫助.

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_filesystem | binary                                    |
| character_set_results    | latin1                                    |
| character_set_server    | latin1                                    |
| character_set_system    | utf8                                      |
| character_sets_dir      | D:MySQLMySQL Server 5.0sharecharsets |
+--------------------------+-------------------------------------------+
8 rows in set (0.06 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.02 sec)

上面列出的值就是系統的默認值。latin1默認校對規則是latin1_swedish_ci,默認是latin1的瑞典語排序方式.
爲什麼呢默認會是latin1_swedish_ci呢,追溯一下mysql歷史很容易發現(大家可以百度一下)

相信如果mysql是中國開發的,那麼漢語也是默認編碼了

當然我們也可以自己需要修改mysql的默認字符集
在mysql配置文檔my.ini,找到如下兩句:

[mysql]

default-character-set=latin1



# created and no character set is defined
default-character-set=latin1

修改後面的值就可以。

這裏不建議改,仍保留默認值
也就是說啓動 mysql時,如果沒指定指定一個默認的的字符集,這個值繼承自配置文件中的;
此時 character_set_server 被設定爲這個默認的字符集; 當創建一個新的數據庫時,
除非明確指定,這個數據庫的字符集被缺省設定爲 character_set_server; 當選定了一個數據庫時,
character_set_database 被設定爲這個數據庫默認的字符集; 在這個數據庫裏創建一張表時,
表默認的字符集被設定爲 character_set_database,也就是這個數據庫默認的字符集;
當在表內設置一欄時,除非明確指定,否則此欄缺省的字符集就是表默認的字符集。

這樣問題就隨之而來了,我的數據庫原來是latin1編碼。因爲在建庫建表的時候,沒有用明確的語言說明編碼方案,如果訪問數據庫時沒指定其的字符集是utf8。自然是亂碼,使用SQL語句:

alter database da_name default character set 'charset'.

或者在建表的時候指定也可以:

CREATE TABLE tablename(
......
)DEFAULT CHARSET=utf8;


可以改編碼.

在網站web.config裏,已經配置了:
<globalization requestEncoding="utf-8" resp fileEncoding="utf-8"/>

所以編碼自然是UTF8了

不過就算這樣,問題還沒有解決,鬱悶,想來想去不明白,以爲是MySql.Data.dll有BUG,就百度Google到處找答案,沒有任何結果.

心恢意冷的時候,想想是不是在連接的時候,使用MySql.Dat連接時沒有告訴Mysql用的是什麼編碼?

朝着這個方向想下去,解決了...

連接字符串時,應該加上編碼:

<add key="MySqlConnectionString" value="Server=X.X.X.X;user id=XXXX;password=XX;database=DATABASENAME;charset=utf8"/>

希望遇到同樣問題的時候,能給大家幫助
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章