計算機只能識別二進制代碼,而人只能看懂文字符號,這兩者之間必須要定義一個轉換規則來使人和計算機識別的是同一個東西,這個規則就是人們制定的字符集。
一、字符集概述
字符集的基礎是ASCII碼,基本上後來所有的字符集都兼容ASCII字符集,但是,由於各公司、各政府、各機構等創建的字符集編碼規則各不相同,這就給軟件移植及協同開發帶來困難,因此有必要統一字符編碼。
Unicode字符集就是後來經過發展得到公認的一個標準,也是現在基本上通行的一個標準,它基本上概括了從古至今人類所使用過的所有文字和符號。
中國結合國際標準及漢字的特性制定了GBK、GB18030等字符集,下表將一些常用字符集的特點進行了歸納:
二、怎樣選擇合適的字符集
對數據庫來說,字符集至關重要,存入數據庫的內容都需要通過字符集進行轉換,它對數據庫的存儲性能、處理性能,以及日後系統的移植、推廣都會有影響。
MySQL支持包括UTF-8、utf8mb4等幾十種字符集,如何進行選擇呢?一般需要根據需求及各字符集本身的特點進行權衡,主要考慮以下幾點:
- 滿足應用支持語言的需要,一般Unicode類型就行,對MySQL來說基本上就是UTF-8。
- 如果涉及已有數據的導入,就需要考慮當前字符集是否對導入的有兼容性,否則可能有些會無法正確導入。
- 如果數據庫只需支持一般中文,且數據量很大,性能要求也高,那就應該選雙字節定長編碼中文字符集,如GBK。相反,如果主要處理英文字符那UTF-8更好。
- 如果數據庫需要做大量的字符運算,如比較排序等,那麼選擇定長字符集更好,因爲它的處理速度快。
- 如果所有客戶端程序都支持相同的字符集,那麼應優先選擇該字符集作爲數據庫字符集,這樣可以避免字符集轉化帶來的開銷和數據損失。
三、MySQL支持的字符集簡介
MySQL支持很多字符集,在同一臺服務器、同一個數據庫甚至同一個表的不同字段都可以指定不同的字符集,這與Oracle等數據庫相比靈活性更高,Oracle的同一個數據庫只能使用同一種字符集。
使用 show character set 命令查看所有可用字符集:
mysql> show character set;
+----------+---------------------------------+---------------------+--------+
| Charset | Description | Default collation | Maxlen |
+----------+---------------------------------+---------------------+--------+
| big5 | Big5 Traditional Chinese | big5_chinese_ci | 2 |
| dec8 | DEC West European | dec8_swedish_ci | 1 |
| cp850 | DOS West European | cp850_general_ci | 1 |
| hp8 | HP West European | hp8_english_ci | 1 |
| koi8r | KOI8-R Relcom Russian | koi8r_general_ci | 1 |
| latin1 | cp1252 West European | latin1_swedish_ci | 1 |
| latin2 | ISO 8859-2 Central European | latin2_general_ci | 1 |
| swe7 | 7bit Swedish | swe7_swedish_ci | 1 |
| ascii | US ASCII | ascii_general_ci | 1 |
| ujis | EUC-JP Japanese | ujis_japanese_ci | 3 |
| sjis | Shift-JIS Japanese | sjis_japanese_ci | 2 |
| hebrew | ISO 8859-8 Hebrew | hebrew_general_ci | 1 |
| tis620 | TIS620 Thai | tis620_thai_ci | 1 |
| euckr | EUC-KR Korean | euckr_korean_ci | 2 |
| koi8u | KOI8-U Ukrainian | koi8u_general_ci | 1 |
| gb2312 | GB2312 Simplified Chinese | gb2312_chinese_ci | 2 |
| greek | ISO 8859-7 Greek | greek_general_ci | 1 |
| cp1250 | Windows Central European | cp1250_general_ci | 1 |
| gbk | GBK Simplified Chinese | gbk_chinese_ci | 2 |
| latin5 | ISO 8859-9 Turkish | latin5_turkish_ci | 1 |
| armscii8 | ARMSCII-8 Armenian | armscii8_general_ci | 1 |
| utf8 | UTF-8 Unicode | utf8_general_ci | 3 |
| ucs2 | UCS-2 Unicode | ucs2_general_ci | 2 |
| cp866 | DOS Russian | cp866_general_ci | 1 |
| keybcs2 | DOS Kamenicky Czech-Slovak | keybcs2_general_ci | 1 |
| macce | Mac Central European | macce_general_ci | 1 |
| macroman | Mac West European | macroman_general_ci | 1 |
| cp852 | DOS Central European | cp852_general_ci | 1 |
| latin7 | ISO 8859-13 Baltic | latin7_general_ci | 1 |
| utf8mb4 | UTF-8 Unicode | utf8mb4_general_ci | 4 |
| cp1251 | Windows Cyrillic | cp1251_general_ci | 1 |
| utf16 | UTF-16 Unicode | utf16_general_ci | 4 |
| utf16le | UTF-16LE Unicode | utf16le_general_ci | 4 |
| cp1256 | Windows Arabic | cp1256_general_ci | 1 |
| cp1257 | Windows Baltic | cp1257_general_ci | 1 |
| utf32 | UTF-32 Unicode | utf32_general_ci | 4 |
| binary | Binary pseudo charset | binary | 1 |
| geostd8 | GEOSTD8 Georgian | geostd8_general_ci | 1 |
| cp932 | SJIS for Windows Japanese | cp932_japanese_ci | 2 |
| eucjpms | UJIS for Windows Japanese | eucjpms_japanese_ci | 3 |
| gb18030 | China National Standard GB18030 | gb18030_chinese_ci | 4 |
+----------+---------------------------------+---------------------+--------+
41 rows in set (0.00 sec)
MySQL的字符集包括字符集和校對規則兩個概念。字符集用來定義存儲字符串的方式,校對規則用來定義比較字符串的方式,一個字符集可以對於多種校對規則。
使用 show collation like ’ *** ‘ 命令來查看相應字符集的校對規則:
mysql> show collation like 'gbk%';
+----------------+---------+----+---------+----------+---------+
| Collation | Charset | Id | Default | Compiled | Sortlen |
+----------------+---------+----+---------+----------+---------+
| gbk_chinese_ci | gbk | 28 | Yes | Yes | 1 |
| gbk_bin | gbk | 87 | | Yes | 1 |
+----------------+---------+----+---------+----------+---------+
2 rows in set (0.00 sec)
校對規則的命名約定:以字符集名開始,包含語言名,以_ci(大小寫不敏感)、_cs(大小寫敏感)、_bin(二元,基於字符編碼的值而與語言無關)結束。
下面的例子就介紹了字母根據校對規則是否對大小寫的敏感:
mysql> select case when 'A' collate gbk_chinese_ci = ('a' collate gbk_chinese_ci) then 1 else 0 end;
+---------------------------------------------------------------------------------------+
| case when 'A' collate gbk_chinese_ci = ('a' collate gbk_chinese_ci) then 1 else 0 end |
+---------------------------------------------------------------------------------------+
| 1 |
+---------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> select case when 'A' collate gbk_bin = ('a' collate gbk_bin) then 1 else 0 end;
+-------------------------------------------------------------------------+
| case when 'A' collate gbk_bin = ('a' collate gbk_bin) then 1 else 0 end |
+-------------------------------------------------------------------------+
| 0 |
+-------------------------------------------------------------------------+
1 row in set (0.00 sec)
四、MySQL字符集的設置
MySQL的字符集和校對規則有4個級別的默認設置:服務器級、數據庫級、表級和字段級;它們分別在不同的地方設置,作用也不同。
4.1 服務器的字符集和校對規則
首先通過以下命令來查看當前服務器的的字符集和校對規則:
mysql> show variables like 'character_set_server';
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| character_set_server | utf8 |
+----------------------+-------+
1 row in set, 1 warning (0.00 sec)
mysql> show variables like 'collation_server';
+------------------+-----------------+
| Variable_name | Value |
+------------------+-----------------+
| collation_server | utf8_general_ci |
+------------------+-----------------+
1 row in set, 1 warning (0.00 sec)
一般通用的編碼規則就選utf8,如果有需要要更改,那麼在服務器端基本有以下三種方式:
- (Linux環境下)直接修改配置文件my.cnf;具體步驟如下:1.關閉MySQL;2.在配置文件裏面的[mysqld]字段下面[mysqld safe]字段前面添加參數“ character-set-server=utf8 " ;3.重啓MySQL;4.使用命令’ show variables like " %char%" ‘ 來查看結果。
- (windows環境下)修改的是my.ini配置文件:步驟與上面的基本一樣,只不過需要注意的是MySQL版本如果在5.53之前,添加的參數是‘ default-character-set=utf8 ' ,在此之後就是“ character-set-server=utf8 ";另外,如果這樣設置後發現沒有更改成功,那麼可能與windows系統有關,只需要再在上面的參數下添加 " [client] default-character-set=utf8 " (注意分兩行寫)應該就可以了。
- 在啓動選項中指定;例如:mysqld --character-set-server=utf8;
- 在安裝MySQL時就指定好字符集(推薦)
如果沒有指定都會使用默認值,比如上面都指定了字符集沒有指定校對規則,那麼就會使用默認的,如果不想使用默認的,那麼只需要在指定字符集的同時指定校對規則即可。
4.2 數據庫的字符集和校對規則