[DB][mysql]下出现 java.sql.SQLException: Incorrect string value: '\xF4\x80\x8E\xAE\xE8\x83...'


现象:保存数据时出现类似以下的错误:

 java.sql.SQLException: Incorrect string value: '\xF4\x80\x8E\xAE\xE8\x83...' for column 'CP_PUBLISHING' at row 1

原因:保存的字符中含有4字节的字符,表情符号(emoji)和一些生僻的汉字是4字节的字符。UTF-8编码只支持1-3个字节、所以当UTF-8字段存入4字节字符时就会报错。MYSQL5.5起、开始支持4字节字符。需将字段编码设置为utf8mb4.  utf8是utf8mb4的子集,utf8mb4兼容utf8.


支持4字节字符的前提:

1)mysql升级到5.5+版本

2)将字段编码修改为utf8mb4

3)数据库连接串中增加:autoReconnect=true&characterEncoding=utf-8

        如:"jdbc:mysql://172.23.1.1:3306/nrps?autoReconnect=true&characterEncoding=utf-8"


除此之外还需要做以下步骤:

方案一:修改全局变量my.cnf

  1. [client]  
  2. default-character-set=utf8mb4  
  3.   
  4. [mysqld]  
  5. character-set-server = utf8mb4  
  6. collation-server = utf8mb4_unicode_ci  
  7. init_connect='SET NAMES utf8mb4'  
  8. skip-character-set-client-handshake = true  
  9.   
  10. [mysql]  
  11. default-character-set = utf8mb4  

方案二:在数据库连接串中增加init_connect_sql SET NAMES utf8mb4

本文以druid连接池为例说明、其他连接池init_connect_sql的配置另查。

[
  {
    "dsName": "tyyd_mysql",
    "url": "jdbc:mysql://172.23.1.1:3306/nrps?autoReconnect=true&characterEncoding=utf-8",
    "username": "nrps",
    "validationQuery":"select 1",  
    "filters": "config",
    "poolPreparedStatements":false,
    "connectionProperties": "config.decrypt=true",
    "password": "xxx",
     connectionInitSqls: ["set names utf8mb4;"],
  }
]



你可能感兴趣的:(数据库专区)