MySQL字符集或字符序

 

 
字符集基礎
字符集:數據庫中的字符集包含兩層含義
  1. 各類文字和符號的集合,包括各國家文字,標點符號,圖形符號,數字等。
  2. 字符的編碼方式,即二進制數據與字符的映射規則;
 
字符集分類:
  • ASCII:美國信息互換標準編碼;英語和其餘西歐語言;單字節編碼,7位(bits)表示一個字符,共128字符。
  • GBK:漢字內碼擴展規範;中日韓漢字、英文、數字;雙字節編碼;共收錄了21003個漢字,GB2312的擴展。
  • utf-8:Unicode標準的可變長度字符編碼;Unicode標準(統一碼),業界統一標準,包含世界上數十種文字的系統;utf-8使用一至4個字節爲每個字符編碼。
  • 其餘常見字符集:utf-32,utf-16,big5(繁體字),latin1()
 
mysql字符集:
查看字符集:
複製代碼

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

 

新增字符集:sql

在編譯mysql時用--with-charset=gbk 來新增字符集
 
 
字符集與字符序(字符排序的規則)
charset 和 collation
 
字符集與字符序是一對多的關係,但一個字符集至少有一個字符序
 
collation:字符序,字符的排序與比較規則,每一個字符集都有對應的多套字符序。
 
不一樣的字符序決定了字符串在比較排序中的精度和性能不一樣。
 
查看字符序
mysql> SHOW COLLATION ;
 
mysql的字符序聽從命名慣例:
  • 以_ci(表示大小寫不敏感)
  • 以_cs(表示大小寫敏感)
  • 以_bin(表示用編碼值進行比較)
 
字符集設置級別
charset 和 collation的設置級別:
服務器級>>數據庫級>>表級>>列級
 
服務器級
系統變量(可動態設置):
--character_set_server:默認的內部操做字符集
--character_set_system:系統元數據(字段,表名等)字符集
 
設置:
  • 使用命令直接設置
  • 配置文件中設置:mysqld,
 
 
數據庫級(數據庫中存儲數據的默認字符集)
create database db_name character set latin1 collate latin1_swedish_ci;
-character_set_database:當前選中數據庫的默認字符集
主要影響load data 等語句的默認字符集;create database的字符集若是不設置,默認使用character_set_server的字符集。
 
表級
mysql>create table tbl(...) default charset=utf-8 default collate=utf8_bin

 

數據存儲字符集使用規則:
  • 使用列集的character set 設定值
  • 若列級字符集不存在,則使用對應表級的default character set 設定值;
  • 若表級字符集不存在,則使用數據庫級的default character set 設定值
  • 若數據庫字符集不存在,則使用服務器級character_set_server設定值
 
實踐

 
查看字符集
show [global] variables like 'character%'
show [global] variables like 'collation%'
 
複製代碼
mysql> SHOW VARIABLES LIKE '%CHARACTER%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
 
mysql> SHOW VARIABLES LIKE '%collation%';
+----------------------+-------------------+
| Variable_name        | Value             |
+----------------------+-------------------+
| collation_connection | utf8_general_ci   |
| collation_database   | latin1_swedish_ci |
| collation_server     | latin1_swedish_ci |
+----------------------+-------------------+
複製代碼
 
修改字符集
 
修改服務器級字符集
set global character_set_server=utf8; (全局)
修改表級字符集
alter table tbl convert to character set XXX;(表)
mysql> alter table stu convert to character set utf8;

 

客戶端鏈接與字符集
鏈接與字符集
-character_set_client:客戶端來源數據使用的字符集(客戶端程序發過來的SQL用什麼來編碼的)
-character_set_conection:鏈接層字符集(作中間層轉換)
-character_set_results:查詢結果字符集(返回給客戶端程序用的字符集)
 
通常能夠統一設置(推薦):
msyql>set  names utf8;
也能夠統一叫作鏈接字符集;
 
 
在配置文件中:
default-character-set = utf8
 
客戶端鏈接字符集

 

常見亂碼緣由:
  • 數據存儲字符集不能正確編碼(不支持)client發來的數據:client(utf8)->storage(latin1)
  • 程序鏈接使用的字符集與通知mysql的character_set_client,character_set_conection,character_set_results 等不一致或不兼容。(告訴mysql:set names gbk ;程序鏈接使用的字符集一致)
 
 
1.甚至表自己utf8,而設置 set names gbk, 程序鏈接也使用 gbk;
此時向表中插入漢字,依然能夠顯示而並不亂碼,由於雖然程序鏈接使用gbk編碼,mysql內部會將gbk轉換成utf8來顯示;
 
2.表utf8,set names utf8,可是 程序鏈接使用 gbk,此時向表中插入漢字,是亂碼的。
 
 
load data 出現亂碼:
複製代碼
aiapple@ubuntu:~$ file test.t
test.t: UTF-8 Unicode text
aiapple@ubuntu:~$ cat test.t
你好
 
mysql> show variables like '%char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                         |
| character_set_connection | utf8                    |
| character_set_database   | gbk                   |
| character_set_filesystem | binary                   |
| character_set_results    | utf8                        |
| character_set_server     | utf8                        |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
 
mysql>load data infile '/home/aiapple/test.t' into table t;
複製代碼

此時會出現亂碼,即告知數據庫的character_set_database   的字符集與程序使用的文件test.t 不同;數據庫

更改set character_set_database   =   utf8 則能正常顯示;
這裏與 普通告知mysql字符集 set names xxx 區別開來,畢竟是導入表到一個 數據庫當中,應該使數據庫的字符集與文件的字符集相同
 
 
客戶端鏈接與字符集
使用建議:
  • 建立數據庫/表時顯示的指定字符集,不使用默認
  • 鏈接字符集與數據存儲字符集設置一致,推薦使用utf8
  • 驅動程序鏈接時顯示指定字符集(set names xxx)
 
客戶端的設置:
 

 

 
三要素:
1.程序驅動或客戶端的字符集(在客戶端設置)
2.告知mysql的字符集(set names xxx)
 3.數據存儲的字符集(表結構的字符集alter table tbl convert to character set xxx)
 
前兩個必須一致纔不會出現亂碼,推薦三個都設置成一致
 
需求:在系統運行了一段時間,有了必定的數據,後發現字符集不能知足要求須要從新修改,又不想丟棄這段時間的數據。
alter database character set xxx 或者alter table  tablename character set xxx;這兩條命令只對想建立的表或者記錄生效
 
方法:先將數據導出,通過適當的調整從新導入纔可完成。
如下模擬的是將latin1字符集的數據庫修改爲GBK字符集的數據庫的過程
1)導出表結構
mysqldump -uroot -p --default-character-set=gbk -d WY_yun >createtab.sq
--default-character-set表示設置以什麼字符集鏈接;-d表示只導出表結構,不導出數據
 
2)手動修改creatatab.sql中表結構定義中的字符集爲新的字符集
 
3)確保記錄不在更新,導出全部記錄
mysqldump -uroot -p --quick --no-create-info --extended-insert --default-character-set=latin1 WY_yun > data.sql
-quick:該選項用於轉存儲大的表。它強制mysqldump 從服務器一次一行地檢索表中的行,而不是檢索全部的行,並在輸出前將它緩存到內存中。
--no-create-info:不寫從新建立麼個轉存儲表的create table 語句
--extended-insert:使用包括幾個VALUES列表的多行insert語法。這樣使轉存儲文件更小,重載文件時能夠加速插入
--default-character-set=latin1:按照原有的字符集導出全部數據,這樣導出的文件中,全部中文都是可見的,不會保存成亂碼
 
4)修改數據的字符集爲新字符集---打開data.sql,將set names latin1 修改爲 set names gbk
 
5)使用新得字符集建立新的數據庫
mysql> create database na default charset gbk;
 
6)將新字符集的表結構導入新庫;建立表,執行createtab.sql
mysql -uroot -p na <createtab.sql
 
7) 將新字符集的數據文件導入新庫;導入數據,執行data.sql
 mysql -uroot -p na < data.sql
彷佛實驗沒有成功能夠去提問?

總結ubuntu

 


 

  • 字符集與字符序是1:N
  • 字符序是字符的排序與比較規則及字符的精度和性能;
  • 表級別字符集修改:alter table stu convert to character set utf8;
  • 三個鏈接相關字符集統一設置:set names utf8;
  • 常見亂碼緣由
  • load數據時,因讓數據庫級別的字符集與文件相同;
  • 三要素:
    •   程序驅動或客戶端的字符集(在客戶端設置)
    •   告知mysql的字符集(set names xxx)
    •   數據存儲的字符集(表結構的字符集alter table tbl convert to character set xxx)
  • 運行一段時間後發現數據亂碼,如何保存數據;
相關文章
相關標籤/搜索