mysql字元集,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(永久性改變)
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。