程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> mysql字符集,mysql字符集設置

mysql字符集,mysql字符集設置

編輯:MySQL綜合教程

mysql字符集,mysql字符集設置


mysql字符集
  字符集基礎 字符集:數據庫中的字符集包含兩層含義   字符集分類:
  • 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 |

 

新增字符集:

在編譯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
似乎實驗沒有成功可以去提問?

總結

 


 

  • 字符集與字符序是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)
  • 運行一段時間後發現數據亂碼,如何保存數據;
   

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved