前端接口调用出现错误,经过排查,终于锁定问题,客户的微信昵称包含emoji符号,字符编码不匹配导致的,因为大多数人昵称是文字数字字母组合,后端把使用的字符集更新为utf8mb4 即可解决问题。

报错:

↵### 更新数据库时出错。原因:java.sql。SQLException:第1行“message”列的字符串值“\xF0\x9F\xA7\xB8”,…”不正确
↵### 错误可能涉及com.dhy.service.data.dao.mapper。MessageDeliveryMapper.insertSelective-Inline
↵### 设置参数时出错↵### SQL:插入商店消息交付(id,correlation_data_id,exchange,routing_key,message_type,message,ack,create_time)值(
↵### 原因:java.sql。SQLException:第1行“message”列的字符串值“\xF0\x9F\xA7\xB8”,…”不正确
↵; 未分类的SQLException;SQL状态[HY000];错误代码[1366];字符串值不正确:第1行的列'message'的'\xF0\x9F\xA7\xB8“,…';嵌套异常为java.sql.SQLException:字符串值不错误:'\xF0#x9F\xA7\xB8”,…'第1行的列'message'“。

我在调用更新接口时成功了但是返回的message指出了问题 java.sql.SQLException: Incorrect string value: '\xF0\x9F\xA7\xB8' 错误信息指出了问题的根源:字符串值不正确。更新数据库时尝试将一条特殊字符(在这个案例中是一个emoji表情符号“🧸”)的消息插入数据库时失败了。

原因分析:

  1. 字符编码问题:这个问题通常发生在尝试将含有4字节UTF-8字符(比如某些emoji表情符号)插入到仅支持最多3字节UTF-8字符的数据库列中时。MySQL的utf8字符集只支持最多3字节的UTF-8字符,而emoji表情符号是4字节的UTF-8字符,所以需要使用utf8mb4字符集来支持这些字符。

解决方案:

  1. 升级字符集:确保你的数据库和相关表的字符集是utf8mb4,而不是utf8utf8mb4字符集完全兼容utf8,但它支持每个字符最多4个字节,包括那些emoji表情符号。
  • 可以通过以下SQL命令来修改数据库和表的字符集:
-- 修改数据库字符集
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

-- 修改表字符集
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
  • 同时,也要确保连接数据库的客户端或应用程序使用的是utf8mb4编码。
  1. 检查连接设置:如果你的数据库已经是utf8mb4,还需要检查应用程序连接数据库时使用的字符集设置。确保连接字符串中指定了正确的字符集,例如,在JDBC连接URL中使用characterEncoding=UTF-8useUnicode=true参数(如果是MySQL)。
  2. 更新驱动程序:确保你使用的JDBC驱动程序是最新的,因为旧版本的驱动可能不完全支持utf8mb4字符集。

综上所述,这个错误主要是由于字符编码不匹配导致的。通过将数据库、表和连接的字符集更新为utf8mb4并确保应用程序正确处理UTF-8编码,可以解决这个问题。