線上問題:前端輸入emoji表情符時,MySQL插入表情符亂碼,修改MySQL編碼支援資料庫表情符
阿新 • • 發佈:2018-12-20
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. 解決步驟
- 修改資料庫配置項:位於xxxx\MySQL Server 5.7\my.ini default-character-set=utf8mb4 character-set-server=utf8mb4
注意:如果配置項不存在,根據圖中位置手動新增
-
修改已經建立資料庫的編碼格式 ALTER DATABASE iot CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
-
可以通過以下指令修改每一個表和表中每一行記錄的編碼格式
- 每個表: 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,以支援表情符號