官术网_书友最值得收藏!

1.4 MySQL數據庫中數據表亂碼解決方法

在研究安全技術的過程中,需要花很多時間跟數據庫打交道,而如果數據庫中的數據“不聽話”,就會引起大麻煩。相信很多讀者朋友都曾遇到數據庫中的數據出現亂碼的情況。研究發現,其原因通常是在字符集設置過程中出現了問題。

1.4.1 字符集基礎知識

字符值包括字母、數字和特殊符號。在存儲字符值之前,必須將字母、數字和特殊符號轉換為數值代碼。所以,必須建立一個轉換表,其中包含每個相關字符的數值代碼。這樣的轉換表稱為字符集,有時也稱為代碼字符集(Code Character Set)或字符編碼(Character Encoding)。

要想讓計算機處理字符,不僅需要考慮從字符到數值的映射,還需要考慮如何存儲這些數值,所以就誕生了編碼方案的概念。是定長存儲還是變長存儲?是用一個字節還是用多個字節?仁者見仁,智者見智。根據不同的需要,產生了很多編碼方案。例如,對于Unicode,就存在UTF-8、UTF-16、UTF-32。而在MySQL中,字符集的概念和編碼方案的概念被作為同義詞看待,一個字符集(Character Set)是由一個轉換表和一個編碼方案組合而成的。Collation(校對)的概念是為了解決排序和分組問題提出的——在字符的排序和分組過程中需要比較字符,而Collation定義了字符的大小關系。

MySQL的字符集支持(Character Set Support)包括字符集和排序方式兩個方面,對字符集的支持細化到服務器(Server)、數據庫(Database)、數據表(Table)、連接(Connection)四個層次。

1.MySQL默認字符集

MySQL對于字符集的指定可以細化到一個數據庫、一張表、一列應該用什么字符集。

· 在編譯MySQL時,會指定一個默認的字符集。這個字符集是latin1。

· 在安裝 MySQL 時,可以在配置文件 my.ini 中指定一個默認的字符集。如果沒有指定,就繼承在編譯時指定的值。

· 啟動mysqld守護進程時,可以在命令行參數中指定一個默認的字符集。如果沒有指定,就繼承配置文件中的值,此時character_set_server被設置為默認字符集。

· 在創建一個新的數據庫時,除非明確指定,這個數據庫的字符集默認被設置為 character_set_server。

· 當選定一個數據庫時,character_set_database被設置為這個數據庫的默認字符集。

· 當在這個數據庫里創建一張表時,此表的默認字符集被設置為character_set_database(也就是這個數據庫的默認字符集)。

· 當在表內設置一列時,除非明確指定,此列的默認字符集就是表的默認字符集。

如果采用默認設置,那么所有數據庫中的所有表的所有列都用latin1存儲。不過,在安裝MySQL時一般都會選擇多語言支持,也就是說,安裝程序會自動在配置文件中把 default_character_set 設置為UTF-8,這保證了在默認情況下所有數據庫的所有表的所有列都使用UTF-8進行存儲。

2.查看默認字符集

查看系統的字符集和排序方式,可以通過下面兩條命令實現。

3.修改默認字符集

修改默認字符集,最簡單的方法就是修改MySQL的my.ini文件中的字符集鍵值,示例如下。

修改后,重啟MySQL服務,示例如下。

執行“mysql>SHOW VARIABLES LIKE'character%';”命令,發現數據庫編碼已經是UTF-8了。

還有一種修改字符集的方法,就是使用執行MySQL命令,示例如下。

4.在Linux中修改和查看MySQL數據庫的字符集

查找MySQL的cnf文件的位置,命令如下。

復制small.cnf、my-medium.cnf、my-huge.cnf、my-innodb-heavy-4G.cnf中的一個到/etc目錄下,將其命名為my.cnf,命令如下。

修改my.cnf,命令如下。

在[client]下添加如下內容。

在[mysqld]下添加如下內容

重新啟動MySQL,命令如下。

查看字符集設置,命令如下。

下面介紹其他設置方法。

修改數據庫的字符集,命令如下。

創建數據庫,指定數據庫的字符集,命令如下。

通過配置文件,修改/var/lib/mysql/mydb/db.opt。將

修改為

重新啟動MySQL,命令如下。

通過MySQL命令行修改字符集,命令如下。

1.4.2 字符集亂碼轉換

1.數據庫表字段值為亂碼

筆者在處理數據庫中的數據時發現了一個問題:將導出的MySQL數據庫文件再次導入MySQL數據庫,會出現亂碼,根本無法查看其內容。究其原因,可能是在導出數據庫時選擇了 latin1 或其他編碼類型,如圖1-29所示。雖然可以查看密碼,但user_name等字段顯示為亂碼。通過研究發現,修改字符設置等操作可以將亂碼還原。

2.導出表結構

執行“mysqldump-uroot-ppassword--default-character-set=utf8-d cdb>db.sql”命令,將cdb數據庫以UTF-8字符編碼方式導出到db.sql文件中,如圖1-30所示。

3.修改表結構的編碼方式

使用記事本等編輯器對 db.sql 內的字符集設置進行修改,將“ENGINE=MyISAM DEFAULT CHARSET=latin1;”修改為“ENGINE=MyISAM DEFAULT CHARSET=utf8;”,如圖1-31所示。

圖1-29 某些字段顯示為亂碼

圖1-30 導出表結構

圖1-31 修改表結構的編碼方式

4.將數據導出

執行“mysqldump.exe-uroot-p--quick--no-create-info--extended-insert--default-character-set=latin1 databasename>data.sql”命令,將數據庫中的數據導出到本地文件中,如圖1-32所示。

圖1-32 將數據導出

5.修改數據庫的編碼方式

打開導出的data.sql文件,修改其編碼方式,將“set names latin1;”改為“set names utf8;”,讓客戶端和鏈接使用UTF-8編碼,將數據以UTF-8的形式存儲,如圖1-33所示。

圖1-33 修改數據庫的編碼方式

6.創建數據庫并將數據庫表結構和數據重新導入數據庫

分別執行以下命令,在數據庫中創建cdb3數據庫,設置默認字符編碼為UTF-8,然后將數據庫表結構和數據導入cdb3,如圖1-34和圖1-35所示。

圖1-34 創建表

圖1-35 重新導入表結構和數據

7.成功轉碼

使用Navicat for MySQL工具軟件連接MySQL數據庫,打開cdb3數據庫中的admin_users1表。如圖1-36所示,成功解決了亂碼問題,user_name等字段中的中文字符已顯示出來。

圖1-36 成功解決亂碼問題

主站蜘蛛池模板: 巨野县| 隆德县| 莱阳市| 乌兰县| 新兴县| 丰城市| 泰州市| 罗甸县| 大城县| 葵青区| 深圳市| 安阳市| 德清县| 大安市| 五指山市| 禄劝| 金湖县| 开原市| 富平县| 崇明县| 黎平县| 香港| 宁化县| 绵阳市| 左云县| 阿坝| 东光县| 黑河市| 安远县| 翁源县| 巴彦淖尔市| 石景山区| 苍梧县| 宝清县| 武清区| 荔波县| 湘潭市| 昭苏县| 岳阳市| 新宁县| 建平县|