MySQL字符集概念及設定方法

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

二、MySQL預設字符集
MySQL對於字符集的指定可以細化到一個資料庫,一張表,一列.傳統的程式在建立資料庫和資料表時並沒有使用那麼複雜的配置,它們用的是預設的配置.
    (1)編譯MySQL 時,指定了一個預設的字符集,這個字符集是 latin1;
    (2)安裝MySQL 時,可以在配置檔案 (my.ini) 中指定一個預設的的字符集,如果沒指定,這個值繼承自編譯時指定的;
    (3)啟動mysqld 時,可以在命令列引數中指定一個預設的的字符集,如果沒指定,這個值繼承自配置檔案中的配置,此時 character_set_server 被設定為這個預設的字符集;
    (4)安裝 MySQL選擇多語言支援,安裝程式會自動在配置檔案中把default_character_set 設定為 UTF-8,保證預設情況下所有的資料庫所有表的所有列的都用 UTF-8 儲存。

三、MySQL字符集設定
1.系統變數:
– character_set_server:預設的內部操作字符集
– character_set_client:客戶端來源資料使用的字符集
– character_set_connection:連線層字符集
– character_set_results:查詢結果字符集
– character_set_database:當前選中資料庫的預設字符集
– character_set_system:系統後設資料(欄位名等)字符集
– 還有以collation_開頭的同上面對應的變數,用來描述字元序。

2.用introducer指定文字字串的字符集:
– 格式為:[_charset] ’string’ [COLLATE collation]
– 例如:
       SELECT _latin1 ’string’;
       SELECT _utf8 ‘你好’ COLLATE utf8_general_ci;
– 由introducer修飾的文字字串在請求過程中不經過多餘的轉碼,直接轉換為內部字符集處理。

四、修改my.cnf設定客戶端與服務端字符集
1.停止MySQL;service mysqld stop

2.備份my.cnf檔案:cp /etc/my.cnf /etc/my.cnf.bak

修改my.cnf
vi /etc/my.cnf
在[client]下新增,client為控制客戶端
default-character-set=utf8
在[mysqld]下新增,mysqld為控制伺服器端
default-character-set=utf8

3.重啟MySQL
  spark220:mysqladmin:/usr/local/mysql:>service mysqld restart

4.檢視字符集是否已經修改
  mysql>show variables like '%char%';

注:修改配置檔案,並重啟伺服器,才可以永久生效

五、檢測字符集
mysql> SHOW CHARACTER SET;
mysql> SHOW COLLATION;
mysql> SHOW VARIABLES LIKE 'character%';
mysql> SHOW VARIABLES LIKE 'collation%';
mysql> SQL函式HEX、LENGTH、CHAR_LENGTH
mysql> SQL函式CHARSET、COLLATION

  MySQL的字符集主要是兩個概念,一個是Character Sets,一個是Collations,前者是字元內容及編碼,後者是對前者進行比較操作的一些規則。這兩個引數集可以在資料庫例項、單個資料庫、表、列等四個級別指定。對於使用者來說,一般推薦使用utf8編碼來儲存資料。而要解決亂碼問題,不單單是MySQL資料的儲存問題,還和使用者的程式檔案的編碼方式、使用者程式和MySQL資料庫的連線方式都有關係。
客戶端的連線是沒有作用的,客戶端這時候一般需要指定utf8方式連線才能避免亂碼。也就是傳說總的set names命令。
set names utf8命令對應的是伺服器端以下幾個命令:
  SET character_set_client = utf8;
  SET character_set_results = utf8;
  SET character_set_connection = utf8;
注:三個引數是不能寫在配置檔案my.cnf裡的,只能透過set命令來動態修改,但在init_connect裡設定,這個命令在每
個普通使用者連線上來的時候都會觸發執行,可以在[mysqld]部分增加以下一行設定連線字符集:
在[mysqld]下新增:
  init_connect = 'SET NAMES utf8'

總結:
1、編譯安裝MySQL的時候指定兩個引數使用utf8編碼。
2、配置檔案my.cnf設定兩個引數,同時設定init_connect引數。
3、配置檔案my.cnf設定兩個引數,同時客戶端的連線指定set names命令。
4、配置檔案my.cnf裡的client和server處加入default-character-set引數方便管理。

若澤大資料交流群:671914634

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31511218/viewspace-2149668/,如需轉載,請註明出處,否則將追究法律責任。

相關文章