問題分析
普通的字串或者表情都是佔位3個位元組,所以utf8足夠用了,但是移動端的表情符號佔位是4個位元組,普通的utf8就不夠用了,為了應對無線網際網路的機遇和挑戰、避免 emoji 表情符號帶來的問題、涉及無線相關的 mysql 資料庫建議都提前採用 utf8mb4 字符集,這必須要作為移動網際網路行業的乙個技術選型的要點
mysql 版本的限制,mysql 5.5.3之前的版本,支援的utf8為3位元組的,mysql 5.5.3之後的版本支援utf8mb4
解決方案
首先我們看下哪些地方可能需要我們修改編碼:
庫(database)的編碼
表(table)的編碼
字段(column)的編碼
程式中,資料庫的連線url
mysql的配置檔案my.conf中
我們可以先查詢下當前資料庫的編碼資訊:
show variables like 'character_set_%'
variable_name
value
character_set_client
utf8
character_set_connection
utf8
character_set_database
utf8
character_set_filesystem
binary
character_set_results
utf8
character_set_server
utf8
character_set_system
utf8
character_sets_dir
/opt/install/mysql/share/charsets/
我們將庫的編碼修改
datebase charset=utf8mb4
datebase collation=utf8mb4_unicode_ci
將表的編碼修改
character set=utf8mb4
collation=utf8mb4_unicode_ci
將需要支援emoji表情欄位的編碼修改
charset=utf8mb4
collation=utf8mb4_unicode_ci
修改mysql的配置檔案my.conf
[client]
# 客戶端**資料的預設字符集
default-character-set = utf8mb4
[mysql]
# 資料庫預設字符集
default-character-set = utf8mb4
[mysqld]
# 服務端預設字符集
character-set-server=utf8mb4
# 連線層預設字符集
collation-server=utf8mb4_unicode_ci
修改完畢後,記得重新啟動mysql服務
/etc/init.d/mysql restart
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
/opt/install/mysql/share/charsets/
實測:修改專案中的連線資料庫的url,將characterencoding=utf-8去掉,實測此步驟可以不用改變。
字符集知識擴充套件
字符集、連線字符集、排序字符集
utf8mb4對應的排序字符集有utf8mb4_unicode_ci、utf8mb4_general_ci.
utf8mb4_unicode_ci和utf8mb4_general_ci的對比:
準確性:
utf8mb4_unicode_ci是基於標準的unicode來排序和比較,能夠在各種語言之間精確排序
utf8mb4_general_ci沒有實現unicode排序規則,在遇到某些特殊語言或者字符集,排序結果可能不一致。
但是,在絕大多數情況下,這些特殊字元的順序並不需要那麼精確。
效能utf8mb4_general_ci在比較和排序的時候更快
utf8mb4_unicode_ci在特殊情況下,unicode排序規則為了能夠處理特殊字元的情況,實現了略微複雜的排序演算法。
但是在絕大多數情況下發,不會發生此類複雜比較。相比選擇哪一種collation,使用者更應該關心字符集與排序規則在db裡需要統一。
至於排序規則(collation) 選擇預設的 utf8mb4_general_ci,還是 utf8mb4_unicode_ci。 請參考stack overflow的這篇帖子。 討論結果從排序的準確性,以及效能方面,告訴我們應該選用 utf8mb4_unicode_ci。
mysql修改字符集
1,set names charset name set names顯示客戶端傳送的sql語句中使用什麼字符集。因此,set names utf8 語句告訴伺服器將來從這個客戶端傳來的資訊採用字符集utf8 它還為伺服器傳送回客戶端的結果指定了字符集。2 連線字符集和校對 1 一些字符集和校對規則系...
mysql 修改字符集
一 修改my.ini配置檔案 mysql配置檔案 character set server utf8 設定字符集 重啟mysql資料庫服務 檢視當前資料庫字符集 show variables like character 二 修改資料庫字符集 alter database 資料庫名 characte...
mysql 修改字符集
較好的常規辦法 建立制定字符集的資料庫 需求描述 在建立db的時候指定字符集.操作過程 1.使用create database語句建立資料庫 mysql create database if not exists test03 default character set utf8 query ok,...