mysql字符集
字符集定義了字符的編碼方式,其中比較常見的是ASCII、GBK、UTF8編碼集,所有的編碼集都兼容ASCII字符集。
字符集
是否定長
編碼方式
ASCII
是
單字節7位編碼
GBK
是
雙字節編碼
UTF8
否(變長)
1~4字節編碼
UNICODE編碼一般是兩個字節,可以編碼99%的在用字符,提升了效率和內存空間。對MYSQL來說,UNICODE字符集就是UTF8。
在MYSQL執行explain命令的時候,key_len的長度與字符集有很大的關系。
(1).索引字段的附加信息:可以分為變長和定長數據類型。當索引字段為定長數據類型,比如char,int,datetime,需要有是否為空的標記,這個標記需要占用1個字節;對於變長數據類型,比如:varchar,除了是否為空的標記外,還需要有長度信息,需要占用2個字節(所以變長的數據類型總共需要三個字節的額外信息);(備注:當字段定義為非空的時候,是否為空的標記將不占用字節)
(2).同時還需要考慮表所使用的字符集,不同的字符集,gbk編碼的為一個字符2個字節,utf8編碼的一個字符3個字節;
在MYSQL中支持多種字符集,查看mysql支持的字符集 show charater set(或者使用select * from information_schema.character_sets)
MYSQL的字符集包括字符集(CHARACTER)和校對規則(COLLATION),字符集用來定義MYSQL存儲字符串的方式,校對規則用來定義比較字符串的方式。字符集和校對規則是一對多的關系,每個字符集都至少有一個校對規則(默認校對規則)。
可以使用show collation like 'utf8'查看字符集的校對規則
校對規則的命名:字符集的名稱+語言名+後綴。 後綴_ci表示大小寫不敏感,_cs表示大小寫敏感,_bin表示比較是基於字符編碼的值而與language無關。
MYSQL可以支持多種粒度的字符集,粒度從大到小分別是:服務器>數據庫>表>字段。 MYSQL字符集的設置:
當沒有設定編碼集的時候,默認使用latin1作為服務器編碼集。當在/etc/my.cnf文件中mysqld下面添加character_set_server = utf8後,重啟mysql服務,再次執行命令。
數據庫的字符集和校對規則是在創建數據庫的時候指定,也可以在創建數據庫之後使用alter database進行修改。但是注意: 如果數據庫中已經存在數據,因為修改字符集並不能將已有的數據按照新的字符集進行存放,所以不能修改數據庫的字符集直接修改數據的內容。 數據庫的字符集和校對規則: show variables like 'character_set_database'
數據庫沒有指定字符集和校對規則,則使用MYSQL服務的字符集和該字符集默認的校對規則。也可以使用 create database character_set2 charset gbk collate gbk_chinese_ci來指定字符集和校對規則。
表的字符集和校對規則: 表的字符集和校對規則可以在創建表的時候執行,也可以使用alter table進行修改。同樣,如果表中已有數據,修改字符集不會對原有記錄有影響,不會按照新的字符集進行存放。 如果表沒有設置字符集,那麼會繼承其上一級的字符集。
可以使用show create table來查看。
客戶端和服務器交互的字符集和校對規則的設置 對於客戶端和服務器的交互操作,MYSQL提供了三個不同的參數:character_set_client、character_set_connection、character_set_results,分別代表客戶端,連接和返回結果的字符集。通常情況下,這三個字符集應該是相同點,才可以保證數據被正確的讀出和寫入。
- set names xxxx(需要每次都執行)
- 在my.cnf中mysql段加入default_character_set=xxxx(永久性改變)