數據庫-字符集筆記

以下筆記以MYSQL數據庫爲例。

一. 查詢數據庫字符集
show variables like ‘character_set_%’;
show variables like ‘collation_%’;

結果如下:
character_set_client:utf8mb4
character_set_connection:utf8mb4
character_set_database:utf8
character_set_filesystem:binary
character_set_results:utf8mb4
character_set_server:utf8
character_set_system:utf8

字符集說明:
character-set-server/default-character-set:服務器字符集,默認情況下所採用的。
character-set-database:數據庫字符集。
character-set-table:數據庫表字符集。

優先級:character-set-table > character-set-database > character-set-server > default-character-set。所以一般情況下只需要設置character-set-server,在創建數據庫和表時不特別指定字符集,這樣統一採用character-set-server字符集。

character-set-client:客戶端的字符集、客戶端默認字符集。當客戶端向服務器發送請求時(插入、更新數據時),請求以該字符集對數據進行編碼。
character-set-results:結果字符集。服務器向客戶端返回結果或者信息時,結果以該字符集進行編碼。

優先級:character-set-results > character-set-client。如果沒有設置results字符集,character-set-client 的字符集將作爲默認的字符集。所以只需要設置character-set-client字符集。

要處理中文,則可以將character-set-server和character-set-client均設置爲GB2312,如果要同時處理多國語言,則設置爲UTF8。

二. 解決數據庫亂碼
亂碼的問題通常與客戶端數據庫連接數據庫查詢結果的字符集設置有關。

客戶端是指多種訪問mysql 數據庫的方式。通過命令行訪問,命令行窗口就是客戶端;通過JDBC 等連接訪問,程序就是客戶端。

解決亂碼的方法是,將以下四個字符集設置一致:
character-set-server:服務器字符集。
character_set_client:客戶端的字符集。
character_set_results:結果字符集。
character_set_connection:連接字符集。

三. 修改字符集
set 變量名 utf8;

四. varchar類型的解讀

(1)字符和字節啥關係?
字符:我們輸入的東西都叫字符。比如漢字、英文、數字,標點符號等;
字節:文件存儲的最小單位。
字符與字節的轉換:一個英文字符=一個字節;一箇中文字符的字節數,根據編碼方式的不同,字節數不同;UTF8編碼的話,一箇中文字符=3個字節;GBK編碼的話,一箇中文字符=2個字節。

(2)varchar類型的字段,長度到底是指字節還是字符呢,最大長度是多少?
varchar的長度到底是字符還是字節,以數據庫類型而論。

mysql數據庫:varchar存的是字符,最大長度爲65535個字節。
utf8編碼的中文字符,最大長度 = 65535/3 = 20000左右;
GBK編碼的在中文字符,最大長度 = 65535/2 = 30000左右;
英文字符,最大長度 = 65535/1 = 65535;

postgre數據庫:varchar存的是字符,最大長度爲65535個字節。
utf8編碼的中文字符,最大長度 = 65535/3 = 20000左右;
GBK編碼的在中文字符,最大長度 = 65535/2 = 30000左右;
英文字符,最大長度 = 65535/1 = 65535;

oracle數據庫:varchar存的是字節,最大長度爲65535個字節。
utf8編碼的中文字符,最大長度 = 65535;
GBK編碼的在中文字符,最大長度 = 65535;
英文字符,最大長度 = 65535;

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