• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            woaidongmao

            文章均收錄自他人博客,但不喜標題前加-[轉貼],因其丑陋,見諒!~
            隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
            數據加載中……

            mysql字符集調整的個人總結

            sql4.1以后版本都支持多字符集的支持,但是安裝默認的字符集竟然是 latin1這個瑞典文,所以很多人想安裝discuz等論壇為gbkutf-8等字符集的論壇就出現了一些問題。最近我在網上找了一些資料,加上自己又專門在一臺linux服務器上試驗了兩天的經歷,基本解決了字符集的問題,現將我的心得寫出來,供廣大網游參考。

                
            一、原理篇:
                       
                         mysql
            服務器中有六個關鍵位置使用了字符集的概念,他們是:client connectiondatabaseresultsserver 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
            這樣,在編譯的時候,就會把mysqlserver項編譯成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)

                     
            這就說明,除systemutf8之外的所有內容的字符集都為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)


                  
            從上面可以看出,使用了配置文件中修改默認字符集的方法,并沒有把clientconnection
            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

             

            posted on 2009-08-14 17:14 肥仔 閱讀(692) 評論(0)  編輯 收藏 引用 所屬分類: 數據庫

            色综合久久精品中文字幕首页| 久久强奷乱码老熟女网站| 久久亚洲精品中文字幕三区| 精品久久久久一区二区三区| 香蕉久久久久久狠狠色| 1000部精品久久久久久久久| 国产精品免费看久久久香蕉| 欧美国产成人久久精品| 成人精品一区二区久久| 久久SE精品一区二区| 国产精品嫩草影院久久| 久久天天躁狠狠躁夜夜躁2O2O| 国产视频久久| 97久久香蕉国产线看观看| 日产精品久久久久久久| 成人午夜精品久久久久久久小说 | 亚洲级αV无码毛片久久精品| 热久久这里只有精品| 伊人久久精品无码av一区 | 狠狠88综合久久久久综合网| 久久精品无码一区二区三区日韩| 色婷婷综合久久久久中文一区二区| 狠狠久久综合| 国产精品免费久久久久影院| 久久国产精品无码一区二区三区| 久久久国产视频| 亚洲国产成人久久综合碰| 国产精品久久久99| 国内精品久久久久久不卡影院 | 久久久久久久尹人综合网亚洲| 久久国产劲爆AV内射—百度| 亚洲人成无码网站久久99热国产| 精品久久久久久99人妻| 一级做a爱片久久毛片| 久久99热国产这有精品| 2020久久精品国产免费| 99久久99久久| 久久er热视频在这里精品| 日本精品久久久中文字幕| 日本精品久久久久中文字幕| 久久久久国产精品|