<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

        Open source are the greatest wealth---WANGPENG
    posts - 46, comments - 11, trackbacks - 0, articles - 0
       :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    [轉載]mysql字符集調整的個人總結

    Posted on 2009-08-13 12:21 WANGPENG 閱讀(187) 評論(0)  編輯  收藏 所屬分類: DataBase
           mysql4.1以后版本都支持多字符集的支持,但是安裝默認的字符集竟然是 latin1這個瑞典文,所以很多人想安裝discuz等論壇為gbk、utf-8等字符集的論壇就出現了一些問題.最近我在網上找了一些資料,加上自己又專門在一臺linux服務器上試驗了兩天的經歷,基本解決了字符集的問題,現將我的心得寫出來,供廣大網游參考.

         一、原理篇:
               
                 mysql服務器中有六個關鍵位置使用了字符集的概念,他們是:
    client 、connection、database、results、server 、system.

                 a、其中client是客戶端使用的字符集,相當于網頁中的字符集設置如下
    <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庫的設定決定自己的字符集,字段根據表來決定自己
    的字符集.

       二、統一字符集的方法:(以utf-8字符集為例,因為他是目前支持文字種類最廣的字符集)

          1、徹底解決字符集的方法:

           要徹底解決字符集的方法就是讓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編碼.


          2、局部堅決字符集的方法:
     
            如果遇到自己的數據庫使用的是默認安裝的
    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,而且在建數據庫的時候我們可以通過這樣的指令實現數據庫的字符集設置:

     CREATE DATABASE `database` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

    這樣此數據庫內的所有表和字段都將為utf8字符集編碼,所以在配置文件中修改的方法也就失去了意義.

         
         b、我的解決辦法.

          我們可以完全無視數據庫默認的字符集是什么,我們關心的只有數據庫在建立的時候是不是加入了字符集
    選擇.

          (1)使用如下指令建立數據庫:
           
         
         CREATE DATABASE `database` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

          (2)客戶端php程序使用如下方法設定連接所使用的字符集:  
    PHP程序在查詢數據庫之前,執行mysql_query("set names utf8;")
    ;

    例子:
    1. <?php
    2. mysql_connect('localhost','user','password');
    3. mysql_select_db('my_db');
    4.  
    5. //請注意,這步很關鍵,如果沒有這步,所有的數據讀寫都會不正確的
    6. //它的作用是設置本次數據庫聯接過程中,數據傳輸的默認字符集
    7. mysql_query("set names utf8;");
    8.  
    9. //必須將gb2312(本地編碼)轉換成utf-8,也可以使用iconv()函數
    10. mysql_query(mb_convet_encoding("insert into my_table values('測試');", "utf-8", "gb2312"));
    11. ?>
         (3)如果你想使用gb2312編碼,那么建議你使用latin1作為數據表的默認字符集,這樣就能直接用中
    文在命令行工具中插入數據,并且可以直接顯示出來.而不要使用gb2312或者gbk等字符集,如果擔心查詢
    排序等問題,可以使用binary屬性約束,例如:

    create table my_table ( name varchar(20) binary not null default '')type=myisam default charset latin1;
       自此,使用utf8字符集的完整的例子結束了.

         三、
    舊數據升級辦法

        (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
    主站蜘蛛池模板: 看一级毛片免费观看视频| 免费看国产精品3a黄的视频 | 亚洲阿v天堂在线| 日韩精品无码永久免费网站| 韩国18福利视频免费观看| 亚洲一区二区三区在线| 免费精品国产自产拍在| 亚洲av成人一区二区三区| 无码天堂亚洲国产AV| 日本人成在线视频免费播放| 国产日本一线在线观看免费| 91嫩草亚洲精品| 日本三级2019在线观看免费| 亚洲最大在线视频| 性色av免费观看| 国产成人精品日本亚洲| 国产成人久久AV免费| 成人免费无毒在线观看网站| 亚洲精华液一二三产区| 又黄又爽的视频免费看| 亚洲高清中文字幕综合网| 国产高清免费视频| 亚洲欧美成人一区二区三区| 免费中文字幕在线观看| 国产午夜不卡AV免费| 免费国产综合视频在线看| 国产精品免费久久| 亚洲色偷偷偷网站色偷一区| 高清免费久久午夜精品| 国产亚洲福利精品一区| 日本在线高清免费爱做网站| 老司机精品视频免费| 亚洲AV本道一区二区三区四区| 色爽黄1000部免费软件下载| 好看的电影网站亚洲一区| 亚洲美女免费视频| 亚洲欧洲日产国产综合网| 女人18毛片水最多免费观看| 成人毛片100免费观看| 一本色道久久88亚洲精品综合 | 亚洲熟女少妇一区二区|