歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> 學習Linux

如何解決MySQL字符集亂碼相關問題

如何解決MySQL字符集亂碼相關問題


熱度1 評論 22 www.BkJia.Com  網友分享於:  2017-02-10 07:02:23     浏覽數47170次

如何解決MySQL字符集亂碼相關問題


導讀MySQL自4.1版本推出之後由於中文的特殊性帶來的亂碼問題也隨在互聯網行業出現。主要原因就是不同字符集編碼不同而產生的。本文簡要介紹字符集相關知識及部分亂碼情況的解決方式。一、字符集本概念

字符集的基本概念如下 :

  字符(Character)是指人類語言中最小的表義符號。例如’A’、’B’等  給定一系列字符,對每個字符賦予一個數值,用數值來代表對應的字符,這一數值就是字符的編碼(Encoding)。例如,我們給字 符’A’賦予數值0,給字符’B’賦予數值1,則0就是字符’A’的編碼  給定一系列字符並賦予對應的編碼後,所有這些字符和編碼對組成的集合就是字符集(Character Set)。例如,給定字符列表為{’A’,’B’}時,{’A’=>0, ‘B’=>1}就是一個字符集  字符序(Collation)是指在同一字符集內字符之間的比較規則  確定字符序後,才能在一個字符集上定義什麼是等價的字符,以及字符之間的大小關系  每個字符序唯一對應一種字符集,但一個字符集可以對應多種字符序,其中有一個是默認字符序(Default Collation)  MySQL中的字符序名稱遵從命名慣例:以字符序對應的字符集名稱開頭;以_ci(表示大小寫不敏感)、_cs(表示大小寫敏感)或_bin(表示按編碼值比較)結尾。例如:在字符序“utf8_general_ci”下,字符“a”和“A”是等價的。
二、常見字符集1) ASCII

ASCII是英文American Standard Code for Information Interchange的縮寫,美國標准信息交換代碼是由美國國家標准學會(American National Standard Institute , ANSI )制定的,標准的單字節字符編碼方案,用於基於文本的數據。是基於拉丁字母的一套電腦編碼系統。它主要用於顯示現代英語和其他西歐語言。它是現今最通用的 單字節編碼系統,並等同於國際標准ISO/IEC 646。

ASCII 碼使用指定的7 位或8 位二進制數組合來表示128 或256 種可能的字符。標准ASCII 碼也叫基礎ASCII碼,使用7 位二進制數來表示所有的大寫和小寫字母,數字0 到9、標點符號, 以及在美式英語中使用的特殊控制字符。

2)GBK

GBK即漢字內碼擴展規范,K為擴展的漢語拼音中“擴”字的聲母。英文全稱Chinese Internal Code Specification。GBK編碼標准兼容GB2312,共收錄漢字21003個、符號883個,並提供1894個造字碼位,簡、繁體字融於一庫。

GB2312碼是中華人民共和國國家漢字信息交換用編碼,全稱《信息交換用漢字編碼字符集——基本集》,1980年由國家標准總局發布。基本集共收入漢字 6763個和非漢字圖形字符682個,通行於中國大陸。新加坡等地也使用此編碼。GBK是對GB2312-80的擴展,也就是CP936字碼表 (Code Page 936)的擴展(之前CP936和GB 2312-80一模一樣)。

3)latin1

Latin1是ISO-8859-1的別名,有些環境下寫作Latin-1。

ISO-8859-1
ISO-8859-1編碼是單字節編碼,向下兼容ASCII,其編碼范圍是0x00-0xFF,0x00-0x7F之間完全和ASCII一致,0x80-0x9F之間是控制字符,0xA0-0xFF之間是文字符號。

ISO-8859-1收錄的字符除ASCII收錄的字符外,還包括西歐語言、希臘語、泰語、阿拉伯語、希伯來語對應的文字符號。歐元符號出現的比較晚,沒有被收錄在ISO-8859-1當中。

因為ISO-8859-1編碼范圍使用了單字節內的所有空間,在支持ISO-8859-1的系統中傳輸和存儲其他任何編碼的字節流都不會被拋棄。換言之,把其他任何編碼的字節流當作ISO-8859-1編碼看待都沒有問題。這是個很重要的特性,MySQL數據庫默認編碼是Latin1就是利用了這個 特性。ASCII編碼是一個7位的容器,ISO-8859-1編碼是一個8位的容器。

4)UTF-8

UTF-8(8-bit Unicode Transformation Format)是一種針對Unicode的可變長度字符編碼,又稱萬國碼。由Ken Thompson於1992年創建。現在已經標准化為RFC 3629。UTF-8用1到4個字節編碼UNICODE字符。用在網頁上可以同一頁面顯示中文簡體繁體及其它語言(如日文,韓文)

UTF-8以字節為單位對Unicode進行編碼。

UTF-8的特點是對不同范圍的字符使用不同長度的編碼。對於0x00-0x7F之間的字符,UTF-8編碼與ASCII編碼完全相同。UTF-8 編碼的最大長度是4個字節。

從上表可以看出,4字節模板有21個x,即可以容納21位二進制數字。Unicod的最大碼位0x10FFFF也只有21 位。

如何解決MySQL字符集亂碼問題如何解決MySQL字符集亂碼問題

三、MySQL字符集轉換過程

1. MySQL Server收到請求時將請求數據從character_set_client轉換為character_set_connection

2. 進行內部操作前將請求數據從character_set_connection轉換為內部操作字符集,其確定方法如下:

1) 使用每個Column的CHARACTER SET設定值;
2) 如未設置Column的Character SET,則使用對應表的DEFAULT CHARACTER SET設定值
3) 如Column、Table均未設地Charater SET,則使用對應數據庫的DEFAULT CHARACTER SET設定值
4) 如Column、Table、Database均未設地Charater SET,則使用character_set_server設定值。

3. 將操作結果從內部操作字符集轉換為character_set_results

如何解決MySQL字符集亂碼問題如何解決MySQL字符集亂碼問題

四、中文亂碼現象

Mysqldump導入亂碼

如何解決MySQL字符集亂碼問題如何解決MySQL字符集亂碼問題

Load data導入亂碼

如何解決MySQL字符集亂碼問題如何解決MySQL字符集亂碼問題

五、程序及MySQL字符集配置情況

出現亂碼情況,首先確認寫入程序使用的字符集,MySQL使用的字符集
MySQL使用的字符集情況

通過SHOW VARIABLES LIKE ‘character%’,在上面例子中通過語句獲得字符集設置情況如下:

如何解決MySQL字符集亂碼問題如何解決MySQL字符集亂碼問題

Mysqldump導入亂碼原因 :

1、 首先確認mysqldump –help或查看備份文件頭部信息確認默認字符集
在上例中通過mysqldump –help查看

通過備份文件查看

如何解決MySQL字符集亂碼問題如何解決MySQL字符集亂碼問題

2、 通過 mysql –help 確認導入字符集

default-character-set        gbk

導入的兩種情況如下

1)不修改備份文件,導入由於sql文件中存在set names utf8,則導入後字符集使用的依然是utf8,在系統默認顯示字符集為gbk的情況下,則顯示為亂碼,此時則需要使用set names utf8 才能正常顯示字符

2)修改備份文件,導入前將sql中的set names utf8 去除,在mysql默認字符集為gbk的情況下導入後字符集為gbk,此時mysql顯示字符集為 gbk,兩者一致,則顯示正常

Load data導入亂碼原因

如何解決MySQL字符集亂碼問題如何解決MySQL字符集亂碼問題

對於load data導入亂碼問題的具體解釋在官方文檔中有提及,請參考:

如何解決MySQL字符集亂碼問題如何解決MySQL字符集亂碼問題

這些是無法影響到導入結果的,因此應使用Load 自身的字符集參數來進行數據導入,如下方式:

mysql>load data infile '/tmp/gongzuoshi.ttt' into chartest ; CHARACTERSET gbk
六、總結
1、 編譯安裝MySQL的時候指定DEFAULT_CHARSET=[charset] 與寫入程序保持一致2、 my.cnf中字符集設置與寫入程序保持一致3、 導入數據時,將導入程序與數據庫的鏈接配置為與數據庫字符集一致4、load data需要在語句中設置字符集參數

原文來自:雲計算實戰

本文地址:http://www.linuxprobe.com/solve-mysql-character.html


http://www.bkjia.com/Linuxjc/1191990.html TechArticle

Copyright © Linux教程網 All Rights Reserved