最近遇到一個問題,在微信授權獲取用戶信息的時候,由於微信昵稱(nickName)是表情,無法存入數據庫。
查其原因,原來是因為數據庫的編碼格式不正確,我的是utf-8 改成utf8mb4就可以了。
其實utf-8是Mysql的一個Bug,此utf-8不是真正的我們熟知的UTF-8,mysql中的utf8最多只能支持3bytes長度的字符編碼,對於一些需要占據4bytes的文字,mysql的utf8就不支持了,要使用utf8mb4才行。
在mysql中請大家忘記**utf8**,永遠使用**utf8mb4**。避免以后采坑!!!
所以我在創建用戶表時候是這么設置的
ENGINE=InnoDB AUTO_INCREMENT=10001 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用戶會員表';
所謂utf8_unicode_ci,其實是用來排序的規則。對於mysql中那些字符類型的列,如VARCHAR,CHAR,TEXT類型的列,都需要有一個COLLATE類型來告知mysql如何對該列進行排序和比較。簡而言之,
COLLATE會影響到ORDER BY語句的順序,會影響到WHERE條件中大於小於號篩選出來的結果,會影響**DISTINCT**
、**GROUP BY**
、**HAVING**
語句的查詢結果。另外,mysql建索引的時候,如果索引列是字符類型,也
會影響索引創建,只不過這種影響我們感知不到。總之,
凡是涉及到字符類型比較或排序的地方,都會和COLLATE有關。