Springboot 插入mysql數據包含表情標錯Incorrect string value: '\xF0\x9F\x98\x84\xF0\x9F

項目上線后,一直很穩定,后來加入了微信登錄后,有反饋說異常。排查得出結果是mysql插入的數據包含表情。特此記錄下。

首先分析為什么會出現這樣的情況,原因在于我們的評論數據中存在emoj表情,而這些表情是按照四個字節一個單位進行編碼的,而我們通常使用的utf-8編碼在mysql數據庫中默認是按照3個字節一個單位進行編碼的,正是這個原因導致將數據存入mysql數據庫的時候出現錯誤,那么這個問題我們應該怎么解決呢?

  1. mysql數據修改

    1. 檢查數據庫編碼是不是uft8mb4
    2. 檢查表內的要存儲的字段是不是uft8mb4
    3. 手動sql插入條帶表情的數據是不是成功。
  2. 修改springboot配置文件

    1. 如果是用的默認配置的話,那么需要在applciation.yml中增加如下:
spring:
 datasource:
   url: jdbc:mysql://XXX:3306/XXX?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&autoReconnect=true
   username: root
   password: root #
   tomcat:
     init-s-q-l: SET NAMES utf8mb4 //這是最重要的一步
  1. 如果是使用的數據庫連接池,那么需要手動配置。如Druid:
        @Bean     //聲明其為Bean實例
        @Primary  //在同樣的DataSource中,首先使用被標注的DataSource
        public DruidDataSource dataSource() {
            DruidDataSource datasource = new DruidDataSource();
            datasource.setUrl(url);
            datasource.setUsername(username);
            datasource.setPassword(password);
            datasource.setDriverClassName(driverClassName);
            //configuration
            String connectionInitSqls = "SET NAMES utf8mb4";
            StringTokenizer tokenizer = new StringTokenizer(connectionInitSqls, ";");
            //重點設置該參數
            datasource.setConnectionInitSqls(Collections.list(tokenizer));
            //configuration
            datasource.setInitialSize(initialSize);
            datasource.setMinIdle(minIdle);
            datasource.setMaxActive(maxActive);
            datasource.setMaxWait(maxWait);
            datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
            datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
            datasource.setValidationQuery(validationQuery);
            datasource.setTestWhileIdle(testWhileIdle);
            datasource.setTestOnBorrow(testOnBorrow);
            datasource.setTestOnReturn(testOnReturn);
            datasource.setPoolPreparedStatements(poolPreparedStatements);
            datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);
            try {
                datasource.setFilters(filters);
            } catch (SQLException e) {
                System.err.println("druid configuration initialization filter: " + e);
            }
            datasource.setConnectionProperties(connectionProperties);
            return datasource;
        }
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 一、MySQL架構與歷史 A.并發控制 1.共享鎖(shared lock,讀鎖):共享的,相互不阻塞的。 2.排...
    阿休閱讀 4,688評論 0 37
  • 關于Mongodb的全面總結 MongoDB的內部構造《MongoDB The Definitive Guide》...
    中v中閱讀 32,010評論 2 89
  • MYSQL 基礎知識 1 MySQL數據庫概要 2 簡單MySQL環境 3 數據的存儲和獲取 4 MySQL基本操...
    Kingtester閱讀 7,857評論 5 116
  • 今天看到一位朋友寫的mysql筆記總結,覺得寫的很詳細很用心,這里轉載一下,供大家參考下,也希望大家能關注他原文地...
    信仰與初衷閱讀 4,757評論 0 30
  • 我是界璋的小公舉 同意嗎! 打臉打臉# 好啦明擺著就是啦 愛你~
    unna閱讀 64評論 0 1