mysql4.1之後版本都支持多字符集的支持,可是安裝默認的字符集居然是 latin1這個瑞典文,因此不少人想安裝discuz等論壇爲gbk、utf-8等字符集的論壇就出現了一些問題。最近我在網上找了一些資料,加上本身又專門在一臺linux服務器上試驗了兩天的經歷,基本解決了字符集的問題,現將個人心得寫出來,供廣大網遊參考。
1、原理篇:
mysql服務器中有六個關鍵位置使用了字符集的概念,他們是:client 、connection、database、results、server 、system。
a、其中client是客戶端使用的字符集,至關於網頁中的字符集設置以下 php
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">。
b、其中的connection是鏈接數據庫的字符集設置類型,若是php沒有指明鏈接數據庫使用的字符集類型
就按照服務器端默認的字符集設置。
c、其中database是數據庫服務器中某個庫使用的字符集設定,若是建庫時沒有指明,將使用服務器安裝
時指定的字符集設置。
d、results是數據庫給客戶端返回時使用的字符集設定,若是沒有指明,使用服務器默認的字符集。
e、server是服務器安裝時指定的默認字符集設定。
f、system是數據庫系統使用的字符集設定。
system通常默認是utf-8字符集,server是最高的字符集設定,database沒有單獨設定就按照server的字符
集設定,其餘都是按照server的設定設置字符集。還有,數據庫內的每一個表和字段也都有字符集的概念,通常都
是根據上一級結構決定自身的字符集,好比表就根據database庫的設定決定本身的字符集,字段根據表來決定本身
的字符集。
2、統一字符集的方法:(以utf-8字符集爲例,由於他是目前支持文字種類最廣的字符集)
一、完全解決字符集的方法:
要完全解決字符集的方法就是讓mysql在安裝的時候就是用utf-8的字符集設定,這樣可使上面的六個關鍵
點的編碼都爲utf-8。
a、 在windows下安裝mysql有提示能夠選擇字符集,咱們選擇utf-8就能夠了。
b、在linux下有三種安裝方法,第一種是rpm包安裝,這種由於我沒有使用過因此沒有發言權。
第二種爲可執行程序安裝,這種安裝由於已經被編譯成了latin1這種瑞典語的字符集,因此沒法徹底解決字
符集問題,這個版本咱們後面會講到怎麼解決字符集問題。
第三種爲源碼自行編譯安裝,這種安裝能夠在編譯時設置字符集類型,這部分主要講這種安裝方式。
在編譯mysql是咱們能夠用這樣的指令:./configure --default-character-set=utf8
這樣,在編譯的時候,就會把mysql的server項編譯成utf8的編碼,這樣這個mysql下創建的全部數據庫都將使用utf8
編碼存儲,全部有關的方面都是utf8編碼。
二、局部堅定字符集的方法:
若是遇到本身的數據庫使用的是默認安裝的latin1字符集的(很奇怪爲何mysql要使用這麼個默認字符集)
的狀況咱們能夠這樣來解決。
a、默認請況下咱們在mysql命令行使用status指令察看狀態,能夠看到以下內容:
mysql> status
--------------
mysql Ver 14.7 Distrib 4.1.9, for pc-linux-gnu (i686)
Connection id: 62
Current database:
Current user: root@localhost
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 5.1.11-beta-log
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: latin1
Db characterset: latin1
Client characterset: latin1
Conn. characterset: latin1
UNIX socket: /tmp/mysql.sock
Uptime: 58 min 23 sec
Threads: 2 Questions: 1067 Slow queries: 0 Opens: 0 Flush tables: 1 Open tables: 75 Queries per second avg: 0.305
--------------
還能夠用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 | /usr/local/src/mysql-5.1.11-beta-linux-i686-glibc23/share/mysql/charsets/ |
+--------------------------+---------------------------------------------------------------------------+
8 rows in set (0.00 sec)
這就說明,除system是utf8以外的全部內容的字符集都爲latin1,咱們怎麼樣才能使用utf字符集呢?
有人說能夠在my.cnf文件的[mysqld]段中加入default-character-set=utf8這一項就能夠解決,但通過個人實驗,這一條
徹底沒有必要,如下是增長了這一項後得顯示結果。
mysql> status;
--------------
mysql Ver 14.7 Distrib 4.1.9, for pc-linux-gnu (i686)
Connection id: 62
Current database:
Current user: root@localhost
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 5.1.11-beta-log
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: latin1
Db characterset: utf8
Client characterset: utf8
Conn. characterset: latin1
UNIX socket: /tmp/mysql.sock
Uptime: 1 hour 6 min 18 sec
Threads: 2 Questions: 1071 Slow queries: 0 Opens: 0 Flush tables: 1 Open tables: 75 Queries per second avg: 0.269
--------------
mysql> SHOW VARIABLES LIKE 'character_set_%';
+--------------------------+---------------------------------------------------------------------------+
| Variable_name | Value |
+--------------------------+---------------------------------------------------------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/local/src/mysql-5.1.11-beta-linux-i686-glibc23/share/mysql/charsets/ |
+--------------------------+---------------------------------------------------------------------------+
8 rows in set (0.00 sec)
mysql> SHOW VARIABLES LIKE 'collation_%';
+----------------------+-------------------+
| Variable_name | Value |
+----------------------+-------------------+
| collation_connection | latin1_swedish_ci |
| collation_database | utf8_general_ci |
| collation_server | utf8_general_ci |
+----------------------+-------------------+
3 rows in set (0.01 sec)
從上面能夠看出,使用了配置文件中修改默認字符集的方法,並無把client、connection、
results這三項改爲utf8,並且在建數據庫的時候咱們能夠經過這樣的指令實現數據庫的字符集設置:
這樣此數據庫內的全部表和字段都將爲utf8字符集編碼,因此在配置文件中修改的方法也就失去了意義。
b、個人解決辦法。
咱們能夠徹底無視數據庫默認的字符集是什麼,咱們關心的只有數據庫在創建的時候是否是加入了字符集
選擇。
(1)使用以下指令創建數據庫:
PHP程序在查詢數據庫以前,執行mysql_query("set names utf8;");
例子:CREATE DATABASE `database` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; CREATE DATABASE `database` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
(2)客戶端php程序使用以下方法設定鏈接所使用的字符集:
(3)若是你想使用gb2312編碼,那麼建議你使用latin1做爲數據表的默認字符集,這樣就能直接用中
文在命令行工具中插入數據,而且能夠直接顯示出來.而不要使用gb2312或者gbk等字符集,若是擔憂查詢
排序等問題,可使用binary屬性約束,例如:
create table my_table ( name varchar(20) binary not null default '')type=myisam default charset latin1;
自此,使用utf8字符集的完整的例子結束了。
3、舊數據升級辦法
(1) 導出數據庫:
mysqldump -uroot -p123456 --default-character-set=latin1 --set-charset=utf8 --opt olddatabase > newdatabase.sql
(2) 修改newdatabase.sql,在文件開頭增長一條sql語句: 「SET NAMES utf8;「,保存。
(3)mysql -hlocalhost -uroot my_db < newdatabase.sql
set character_set_server = utf8;html
set characte_set_... = utf8;mysql