mysql字符編碼以及字符序

1、數據庫中有關編碼格式的配置

查看數據庫有關編碼格式的配置
mysql> show variables like 'char%';
+--------------------------+----------------------------------+
| Variable_name | Value |
+--------------------------+----------------------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| character_sets_dir | /paic/mysql/base/share/charsets/ |
+--------------------------+----------------------------------+

可以看到一共8個變量: 
character_set_client 
主要用來設置客戶端使用的字符集。

character_set_connection
主要用來設置連接數據庫時的字符集,如果程序中沒有指明連接數據庫使用的字符集類型則按照這個字符集設置。

character_set_database 
主要用來設置默認創建數據庫的編碼格式,如果在創建數據庫時沒有設置編碼格式,就按照這個格式設置。

character_set_filesystem
文件系統的編碼格式,把操作系統上的文件名轉化成此字符集,即把 character_set_client轉換character_set_filesystem, 默認binary是不做任何轉換的。

character_set_results 
數據庫給客戶端返回時使用的編碼格式,如果沒有指明,使用服務器默認的編碼格式。

character_set_server 
服務器安裝時指定的默認編碼格式,這個變量建議由系統自己管理,不要人爲定義。

character_set_system 
數據庫系統使用的編碼格式,這個值一直是utf8,不需要設置,它是爲存儲系統元數據的編碼格式。

character_sets_dir 
這個變量是字符集安裝的目錄。

2、客戶端設置
其中 character_set_client、character_set_connection 以及 character_set_results 三個變量是客戶端每次連接數據庫時想要的字符編碼,和服務端沒有關係。登錄mysql後,執行 set names gbk; 實際上就是同時修改的這三個參數。

修改上邊三個變量登錄mysql設置:
mysql> set names latin1;

查看變化
mysql> show variables like 'char%';
+--------------------------+----------------------------------+
| Variable_name | Value |
+--------------------------+----------------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| character_sets_dir | /paic/mysql/base/share/charsets/ |
+--------------------------+----------------------------------+

也可以修改配置文件,在 [mysql] 段添加:
default-character-set=latin1

3、服務端設置
character_set_database 是單個數據庫級別的 字符集設置,該參數允許不同的 database 使用不同的字符集。

比如:
create database test1 character set utf8mb4 collate utf8mb4_bin;

這個語句創建了數據庫 test1 ,同時設置了該庫的 character 和 collate 參數。

character_set_server 設置的是 server 級別的也就是配置文件中 [mysqld] 段的字符集,同一個 mysqld 的配置,所有字符存儲時使用相同的字符集。

字符集默認是 lantin1,通常的配置還有 utf8、utf8_bin、gbk 等。

character_set_server 通常和 collation_server (也就是排序規則)一同配置。

排序規則 collation_server 的參數通常有 utf8mb4_bin、utf8mb4_general_ci、utf8_bin、utf8_general_ci。
ci 代表 casesensitive ignore 排序時不考慮大小寫;_bin 結尾的排序時考慮大小寫。

4、編碼格式
latin1:mysql默認的編碼格式,是單字節編碼,所以因爲字節的原因,有些國家的語言不能使用 latin1 顯示。

gbk:GBK是國家標準,包含全部中文字符,不論中英文都採用雙字節編碼。如果數據庫大量存儲漢字,對性能要求高,就應該選擇 GBK 編碼方式。因爲存儲漢字的話,GBK每個漢字只佔用2個字節,UTF8 漢字編碼需要3個字節,GBK 比 UTF8 所佔空間小,還可以減少磁盤I/O,數據庫cache,以及網絡傳輸時間(現在可忽略不計)從而提高性能。

GBK是定長字符集,UTF8 是變長字符集,如果數據庫需要做大量的字符運算、比較、排序等等,選擇定長字符集會更好,因爲定長字符集處理速度要比變長字符集處理速度快。

utf8: UTF8 是 Unicode 字符集,是 UTF16 改良版本,1至4字節編碼規範。國際流行通用使用此編碼,如果你的網站是多國語言就首選這個字符集。

如果數據庫主要處理英文,則建議採用 UTF-8,因爲GBK對英文字符編碼也採用2個字節,而 UTF8 只需要一個字節。

如果客戶有外國的,建議用UTF8,因爲國外客戶訪問GBK的頁面要下載語言包,訪問 UTF-8 編碼的網頁則不出現這問題,UTF-8編碼的文字可以在各國各種支持UTF8字符集的瀏覽器上顯示。

utf8mb4:MySQL在5.5.3之後增加了這個 utf8mb4 的編碼,mb4就是most bytes 4的意思,專門用來兼容四字節的 unicode。好在utf8mb4是utf8的超集,除了將編碼改爲 utf8mb4 外不需要做其他轉換。當然,爲了節省空間,一般情況下使用utf8也就夠了。

因爲 utf8 編碼最大字符長度爲3字節,如果遇到4字節的寬字符就會插入異常了。例如Emoji 表情(Emoji 是一種特殊的 Unicode 編碼,常見於 ios 和 android 手機上),和很多不常用的漢字,以及任何新增的 Unicode 字符等。

爲了獲取更好的兼容性,應該總是使用 utf8mb4 而非 utf8。 對於 CHAR 類型數據,utf8mb4 會多消耗一些空間,根據 Mysql 官方建議,使用 VARCHAR 替代 CHAR。

5、舉例

下面舉個 mysql 的字符集配置案例:

vi /etc/my.cnf
[client] 中添加
default-character-set = utf8mb4

[mysqld] 中修改
character-set-server = utf8mb4 
collation-server = utf8mb4_unicode_ci 
init_connect='SET NAMES utf8mb4'
character-set-client-handshake = FALSE

[mysql] 中添加
default-character-set = utf8mb4

[client] 代表客戶端默認設置內容
[mysql] 代表我們使用mysql命令登錄mysql數據庫時的默認設置
[mysqld] 代表數據庫自身的默認設置

6、出現亂碼分析

編碼格式如果要設置爲UTF8

6.1、檢查服務器端(也就是 [mysqld] 段)配置是否爲 UTF8。

6.2、檢查客戶端(也就是 [client] 和 [mysql] 段)配置是否爲 UTF8。

6.3、檢查ssh工具(例如 SecureCRT )會話選項的配置是否爲 UTF8。

6.4、檢查linux系統默認編碼格式是否爲UTF8

 

參考:

https://www.cnblogs.com/digdeep/p/5228199.html
https://blog.csdn.net/sun8112133/article/details/79921734
https://www.cnblogs.com/beyang/p/7580814.html
https://www.cnblogs.com/zeroingToOne/p/9536888.html

https://www.cnblogs.com/shihaiming/p/5855616.html

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