1. 程式人生 > >線上問題:前端輸入emoji表情符時,MySQL插入表情符亂碼,修改MySQL編碼支援資料庫表情符

線上問題:前端輸入emoji表情符時,MySQL插入表情符亂碼,修改MySQL編碼支援資料庫表情符

1. 背景

線上系統執行時,運維反饋,後臺log忽然報了許多插入亂碼問題。log資訊大致如下:

2018-07-19 00:00:13.593 [http-nio-8080-exec-173] ERROR c.k.i.b.s.service.impl.QuestionnaireService 1276- error
org.springframework.jdbc.UncategorizedSQLException: 
### Error updating database.  Cause: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x91\x8D\xF0\x9F...' for column 'answerValue' at row 11
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### SQL: INSERT INTO         questionnaire_record(paperId,questionId,answerValue,patId,visitId,wardNo,submitTime,publishedTime,UUID)         VALUES                        (             ?,             ?,             ?,             ?,             ?,             ?,             now(),             ?,             ?             )          ,              (             ?,             ?,             ?,             ?,             ?,             ?,             now(),             ?,             ?             )          ,              (             ?,             ?,             ?,             ?,             ?,             ?,             now(),             ?,             ?             )          ,              (             ?,             ?,             ?,             ?,             ?,             ?,             now(),             ?,             ?             )          ,              (             ?,             ?,             ?,             ?,             ?,             ?,             now(),             ?,             ?             )          ,              (             ?,             ?,             ?,             ?,             ?,             ?,             now(),             ?,             ?             )          ,              (             ?,             ?,             ?,             ?,             ?,             ?,             now(),             ?,             ?             )          ,              (             ?,             ?,             ?,             ?,             ?,             ?,             now(),             ?,             ?             )          ,              (             ?,             ?,             ?,             ?,             ?,             ?,             now(),             ?,             ?             )          ,              (             ?,             ?,             ?,             ?,             ?,             ?,             now(),             ?,             ?             )          ,              (             ?,             ?,             ?,             ?,             ?,             ?,             now(),             ?,             ?             )          ,              (             ?,             ?,             ?,             ?,             ?,             ?,             now(),             ?,             ?             )          ,              (             ?,             ?,             ?,             ?,             ?,             ?,             now(),             ?,             ?             )
### Cause: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x91\x8D\xF0\x9F...' 

2. 分析

  • 初步分析是業務系統裡問卷的答案裡有表情符,插不進去,定位是emoji字元插入不了資料庫問題

3. 解決步驟

  1. 修改資料庫配置項:位於xxxx\MySQL Server 5.7\my.ini default-character-set=utf8mb4 character-set-server=utf8mb4

在這裡插入圖片描述

注意:如果配置項不存在,根據圖中位置手動新增

  1. 修改已經建立資料庫的編碼格式 ALTER DATABASE iot CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

  2. 可以通過以下指令修改每一個表和表中每一行記錄的編碼格式

  • 每個表: ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
  • 表中每行記錄: ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

在以後建立新表的時候,避免指定編碼格式為utf8,以支援表情符號