1. 程式人生 > >解決微信emjoy特殊符號插入資料庫出錯

解決微信emjoy特殊符號插入資料庫出錯

概述:

最近一個專案中呼叫同事封裝的一個微信獲取資訊介面並處理欄位存入資料庫處理的功能介面,功能測試階段發現關注公眾號資訊並沒有成功返回,而且情況是一些賬號是正常的,一些人卻是有問題的,針對有問題的使用者檢視日誌發現微信官方返回的關注狀態與同事介面返回的內容不符合,也就是說沒有正常更新到。日誌記錄相關SQL,插入資料庫才發現是微信的emjoy符號導致出現問題。

mysql報錯內容:

這裡寫圖片描述
“`
根據上圖看見,是mysql對特殊號的報錯。

方案概況:

針對符號的報錯,搜尋了有沒有解決方案,並且發現了有兩個解決方法。

  1. 修改mysql的編碼。
  2. 對字元過濾後再插入資料庫

具體方案:

1、修改mysql的編碼:

Mysql的utf8編碼最多3個位元組,而Emoji表情或者某些特殊字元是4個位元組。因此我們需要修改編碼能接受4個位元組的,例如utf8mb4。

1.在mysql的安裝目錄下找到my.ini,作如下修改: [mysqld] character-set-server=utf8mb4 [mysql] default-character-set=utf8mb4

2 重啟mysql服務

3 修改表 ALTER TABLE 表名 CONVERT TO CHARACTER SET utf8mb4 COLLATE
utf8mb4_bin;

2、特殊字元過濾:

其實很多時候資料庫中儲存的微信暱稱完整性不是特別重要,例如:“小蕾����”’ 儲存為“小蕾” ,可以考慮直接過濾特殊字元,這樣的優點是不用擔心修改mysql編碼過程中造成其他錯誤。

//微信特殊字元過濾
private function wx_name_filter($str) {
    $name = $str;
    $name = preg_replace('/\xEE[\x80-\xBF][\x80-\xBF]|\xEF[\x81-\x83][\x80-\xBF]/', '', $name);
    $name = preg_replace('/xE0[x80-x9F][x80-xBF]‘.‘|xED[xA0-xBF][x80-xBF]/S','?', $name);
    $return = json_decode(preg_replace("#(\\\ud[0-9a-f]{3})#ie","",json_encode($name)));
    if(!$return){
        return $this->jsonName($return);
    }
    return $str;
}

總結:

個人業務原因採取了過濾字元方案,並且生效了,其實兩種方法都挺方便易懂的,主要是看自己需求,如果專案中太多需要修改的地方,那麼修改mysql編碼方案也不失為一種好方法,當然要注意小心操作。