MySQL字符集

mysql字符集基礎知識

1.什麼叫字符集?常用的字符集的分類?
字符集就是字符和編碼的集合,常用的中文字符集是gbk,英文字符集是ASCII
多種字符在一個字符集裏,常用的UTF8

2.數據庫存取數據與字符集的關係
數據庫在存取數據時,會在字符集中尋找各個字符對應的編碼,然後存取編碼

3.操作系統查看字符集的種類
windows 使用chcp命令查看,查看到是936,說明是中文字符集
在這裏插入圖片描述linux 使用cat /etc/sysconfig/i18n #當前是utf8字符集在這裏插入圖片描述4.在linux中編碼和字符的關係,以ASCII字符集爲例
mysql> select ascii(‘a’); ##查看在ASCII中字符a對應的編碼
±-----------+
| ascii(‘a’) |
±-----------+
| 97 | ##在ascii中,字符a對應的編碼是97
±-----------+
1 row in set (0.01 sec)

mysql> select ascii(‘x’);
±-----------+
| ascii(‘x’) |
±-----------+
| 120 |
±-----------+
1 row in set (0.00 sec)

mysql> select ascii(‘1’);
±-----------+
| ascii(‘1’) |
±-----------+
| 49 | ##字符1對應的編碼是49
±-----------+
1 row in set (0.00 sec)

5.mysql內部存儲字符集的相關知識

1)mysql內部存儲字符集有4種。分別是服務器字符集,數據庫字符集,表字符集,列字符集,他們的優先級順序是列字符集 > 表字符集 > 數據庫字符集 > 數據庫字符集,因爲數據最終存放在列上。我們常用的字符集是數據庫字符集和表字符集,服務器級別一般忽略
如果列的字符集沒有設置,那麼列的字符集就會繼承表的字符集

2)mysql> show character set; ##查看數據庫級別中有哪些字符集

mysql> show variables like ‘%character%’;  ##可以查看到服務器級別(character_set_server)是什麼字符集,一  般忽略!

mysql>show create database test;    ##可以查看到test數據庫是什麼字符集

3)在創建數據庫(database)的時候可以指定該數據庫是哪個字符集,同樣在新建表(table)也可以指定是哪個字符集
EX: mysql> create table t20(name varchar(10)) character set gbk;
Query OK, 0 rows affected (0.06 sec)
##創建t20表,指定爲gbk字符集
mysql>show create table t20;
##可以查看到t20表是哪個字符集

同樣的新建列時也可以指定是哪個字符集
mysql> create table t21(name varchar(10) character set big5); ##新建t21表,表裏有name列,name列上是big5字符集
Query OK, 0 rows affected (0.05 sec)

mysql> show create table t21; ##查看t21表中的信息,可以看到列的字符集
±------±-----------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
±------±-----------------------------------------------------------------------------------------------------------------+
| t21 | CREATE TABLE t21 (
name varchar(10) CHARACTER SET big5 DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
±------±-----------------------------------------------------------------------------------------------------------------+

mysql字符集綜合解惑以及最佳實踐

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/local/mysql/share/charsets/ |
±-------------------------±---------------------------------+

上方標藍字符集的關係圖
在這裏插入圖片描述詳解

  1. character_set_client必須能夠正確反映mysql客戶端(MySQL Client)的字符集是什麼,換句話說,也就是 character_set_client參數和mysql客戶端的字符集是一樣的
    2.character_set_connection一般和character_set_client參數是一樣的
    3.MySQL server中的內部操作字符集就是服務器,數據庫,表,列四類級別的字符集
    4.character_set_results 關係到返回的結果

各類字符集關係詳解
1.客戶端連接服務端,客戶端在往服務端傳輸數據時,數據只能以數字形式傳輸,所以在傳輸之前會對數據進行編碼
假如在客戶端執行insert into t20(name) values(‘你好’);【命令釋義:往t20表中的name列插入你好】。
‘你好’被進行了編碼 假設被編成9190和9133

2.mysql服務端接到你輸入的SQL語句以後,發現裏面有字符,他會在發送之前做以下事情
1)發現是insert命令
2)發現t20表中的name列的數據類型是varchar,varchar裏面存放的是字符,字符就需要編碼
3)找到‘你好’對應的編碼‘9190 ,9193’
4)找到對應編碼以後,客戶端會通過character_set_client參數告訴服務端自己的編碼方式
補充:可以通過status查看客戶端的編碼方式

Client characterset一定要正確的反映客戶端的編碼方式

注:
1)存數據即客戶端執行插入等語句時:
如果客戶端的character_set_client對應的編碼方式與服務器端character_set_connection對應的編碼方式不一致時,會發生轉換;但是只能有一次轉換機會,也可能發生在character_set_connection對應的編碼方式與mysql內部存儲字符集的編碼方式不一致;如果都一致,則不會進行轉換
2)取數據即客戶端向服務端讀取數據時:
服務端的character_set_connection與客戶端的character_set_results,兩者發生協商

注意:存數據和取數據與服務端協商不是一個通道,存數據是與character_set_client參數有關,取數據是與character_set_results參數有關

最佳實踐舉例:在這裏插入圖片描述d1列沒有設置字符集,d2列是utf8,d1和d2列上都含有varchar數據類型的列

當中國用戶往d1列上插入數據時,不用轉換,取數據時也沒有發生轉換,因爲client,connection和d1列的字符集都是gbk

當日本用戶往d2列上插入數據時,在client和connection上沒有發生轉換,在d2列上發生轉換,將日文的字符集轉換爲utf8,取數據時將utf8轉換爲日文字符集

校對規則(collation)
我們需要針對utf8字符集或其他字符集設置一個關於比較和排序的大小寫是否敏感的參數,默認是都不區分大小寫。

如何設置這個參數?
我們需要在建表時,指定collate=utf8_bin(utf8可以換成其他字符集)
mysql> create table t2(id int,name varchar(20)) CHARACTER SET utf8 COLLATE=utf8_bin;
##建表和id,name列,指定爲utf8字符集,並且設置參數爲大小寫敏感
Query OK, 0 rows affected (0.05 sec)

mysql> insert into t2 values(1,‘a’); #往id列中插入1,name列中插入a
Query OK, 1 row affected (0.00 sec)

mysql> insert into t2 values(1,‘A’);
Query OK, 1 row affected (0.00 sec)

mysql> insert into t2 values(1,‘B’);
Query OK, 1 row affected (0.00 sec)

mysql> insert into t2 values(1,‘b’);
Query OK, 1 row affected (0.00 sec)

mysql> select * from t2 where name=‘a’; ##查看t2列中名字叫a的列
±-----±-----+
| id | name |
±-----±-----+
| 1 | a |
±-----±-----+
1 row in set (0.00 sec)

比較未設置參數時
在這裏插入圖片描述

比較兩種方式的排序
在這裏插入圖片描述

utf8_bin是按照字符編碼的數字大小排序
可以使用select ascii(‘字符’)查看對應的編碼號
在這裏插入圖片描述
所以utf8_bin的排序方式是ABab

綜上可以看出設置utf8_bin這個參數會影響排序方式和where條件語句

關於collation的特點
在mysql服務器,數據庫,表,列四種級別中都有collation,且優先級越來越高
我們可以在建表時使用SET utf8 COLLATE=utf8_bin語句設置collation參數,那麼collate有哪些值可以設置呢?我們可以使用show collation;查看允許設置的值。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章