一.字符集介紹
什麼是字符集(charset)
字符集:是乙個系統支援的所有抽象字元的集合。字元是各種文字和符號的總稱,包括各國家文字、標點符號、圖形符號、數字等。
1.gbk/gb2312
gbk/gb2312
採用雙位元組字符集,不論中、英文本元均使用雙字元來表示,為了區分中文,將其最高位都設定成1
gb2312是gbk的子集,gbk是gb18030的子集,gb2312僅能儲存簡體中文本元
gbk包括中日韓字元的大字符集
通常使用gbk字符集足夠
國際通用性比utf8差,不過utf8占用的資料庫比gbk大(utf8是三位元組字符集)
2.utf8/utf8mb4
utf全稱(unicode transformation format),是unicode的一種儲存方式,可變長度字元編碼,又稱萬國碼
資料庫字符集盡量使用utf8(包括 connect、result、及最終html頁面都必須要求一致為utf8)
utf8使用可變長度位元組來儲存 unicode字元,例如 ascii字母繼續使用1個位元組儲存,重音文字、希臘字母、或西里爾字母等使用2個位元組來儲存,而常用的漢字就要用3個位元組;也就是乙個英文本元等於乙個位元組,乙個中文(含繁體)等於三個位元組。
utf8mb4乙個字元最多能存4位元組,所以能支援更多的字符集;專案中常用utf8mb4存放emoji表情
latin1
是8bit (1 bytes)字符集,但不能覆蓋亞洲、非洲語言
unidoce是latin1的擴充套件,增加了亞洲、非洲常規語言支援,但仍不支援全部語言,且ascii用unidoce來表示效率不高(小字符集轉換成大字符集,往往便隨的就是字元的丟失)
utf8是unicode的擴充套件
gbk、gb2312等字符集與utf8之間都必須通過unicode編碼才能相互轉換
二.字符集使用建議
字符集檢視和校驗值檢視命令
mysql> show charset;
mysql> show collation;
1、非常肯定只有中文終端使用者時,可選擇gbk / gb2312
2、為了方便資料遷移、以及多種終端展示,最好是utf8
3、字元無需區分大小寫時,採用預設的xx_ci校驗集可以,否則選擇xx_bin或cs校驗集(生產環境中,盡量不要修改校驗集)
4、預設字符集是latin1,該字符集存放漢字是分開存放,以至於檢索結果時不夠精確,好處就是節省空間,不推薦使用
三.mysql字符集的範圍和優先順序
字符集範圍
伺服器層(server) > 資料庫成(database) > 資料表(table) > 字段(column) > 連線(connection) | 結果集(result)
字符集優先順序
連線(connection) | 結果集(result) > 字段(column) > 資料表(table) > 資料庫成(database) > 伺服器層(server)
四.字符集設定
1.作業系統級別
1)centos 6.x 版本
[root@db01 ~]# vim /etc/sysconfig/i18n
lang="en_us.utf-8"
sysfont="latarcyrheb-sun16"
2)centos 7.x 版本
[root@db01 ~]# vim /etc/locale.conf
lang="en_us.utf-8"
2.mysql例項級別
方法一:編譯安裝時指定
cmake .
-ddefault_charset=utf8 \
-ddefault_collation=utf8_general_ci \
-dwith_extra_charsets=all \
方法二:配置檔案中設定字符集。
vim /etc/my.cnf
[mysqld]
character-set-server=utf8
3.庫別級別的字符集設定
#庫級別的字符集
mysql> create database oldboy charset utf8;
#表級別的字符集
mysql> create table mysql.oldboy(id int)charset utf8;
4.其它的修改字符集的方式
1.臨時生效
mysql> set character_set = 'gbk';
mysql> set character_set_client = 'gbk';
2.全域性生效
mysql> set global character_set_client = 'gbk';
query ok, 0 rows affected (0.00 sec)
五.常用的資料型別
#整型int -2^31 ~ 2^31-1
tinyint -128 ~ 127
#字串型別
char 定長
char(n):n代表的是字元個數(也叫字元長度)、而非bytes
char(n):是固定長儲存,占用定長的儲存空間,不足的部分用空格填充;mysql處理char(n)型別時,需要將空格strip掉後return。
儲存空間:char(n)型別的儲存空間和字符集有關係,結合剛才字符集的知識點,乙個中文在utf8字符集中占用3個bytes、gbk占用2個bytes、數字和字元統一用乙個字元表示。
儲存機制:在不夠n長度時,mysql在儲存資料時,需要用填充特殊的空格,而非十六進製制的20
varchar 變長
varchar(n):n代表的是字元個數(也叫字元長度)、而非bytes
varchar(n):是變長儲存,僅使用必要的儲存空間.
儲存空間:varchar(n)型別的儲存空間和字符集有關係,結合剛才字符集的知識點,乙個中文在utf8字符集中占用3個bytes、gbk統一占用2個bytes、數字和字元乙個字元表示。
儲存機制:varchar(n)字段儲存實際是從第二個位元組開始儲存,然後用1到2個位元組表示實際長度,剩下的才是可以儲存資料的範圍,因此最大可用儲存範圍是65535-3=65532位元組;第乙個位元組標識是否為空.(長度小於255位元組,使用乙個位元組來表示長度;大於255位元組使用兩個位元組來表示長度)
#列舉型別
enum
#日期型別
datetime
timestamp
常見字符集 亂碼問題
常用字符集分類 ascii及其擴充套件字符集 作用 表語英語及西歐語言。位數 ascii是用7位表示的,能表示128個字元 其擴充套件使用8位表示,表示256個字元。範圍 ascii從00到7f,擴充套件從00到ff。iso 8859 1字符集 作用 擴充套件ascii,表示西歐 希臘語等。位數 8...
mysql 集群字符集 Mysql 字符集
字符集與字元比較 字符集字符集是某種字元的集合,比如最常見的ascii碼,由127個字元組成,只需要乙個位元組就能表示 我們常說的字符集還是gbk iso utf8 mysql 我們使用得最多的字符集就是gbk 和 utf8了 他們都是變長字符集,如果字元在ascii範圍內就使用乙個位元組表示,其他...
mysql字符集 MySQL字符集選擇
一 怎樣選擇合適的字符集 對mysql資料庫來說,字符集很重要,因為資料庫儲存的資料大部分都是各種文字,字符集對資料庫的儲存,處理效能都會有所影響。主要考慮一下幾方面的因素 1.滿足應用支援語言的需求,應用處理各種各樣的文字,發布到使用不同語言的國家或地區,可以選擇unicode字符集,mysql的...