解决SQLException: Incorrect string value异常
java开发中会遇到如下异常:
org.apache.ibatis.exceptions.PersistenceException:
### Error updating database. Cause: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x95\xB32:...' for column 'baseInfo' at row 1
### The error may involve com.fsl.zmt.dao.PoiInfoSkuDao.save-Inline
### The error occurred while setting parameters
### SQL: INSERT INTO mt_poi_info_sku (dealId, poiId, name, baseInfo, bookRule, useRule, refundRule, date,status, marketPrice, sellPrice, settlePrice, stockType, stock, stockMode, createTime) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, now());
### Cause: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x95\xB32:...' for column 'baseInfo' at row 1
毫无疑问,是数据编码问题导致的db异常
记录一下我的快速解决方案:
1:针对报的数据库表字段修改字段编码
ALTER TABLE mt_poi_info_sku MODIFY COLUMN baseInfo LONGTEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
2:springboot工程datasource初始化变动
新增: dataSource.setConnectionInitSqls(Arrays.asList("set names utf8mb4;"));
@Beanpublic DruidDataSource dataSource(){System.out.println("----------------"+url);DruidDataSource dataSource = new DruidDataSource();dataSource.setDriverClassName(driver);dataSource.setUrl(url);dataSource.setUsername(username);dataSource.setPassword(password);dataSource.setMaxActive(maxActive);//dataSource.setMaxIdle(maxIdel);dataSource.setMaxWait(maxWait);dataSource.setInitialSize(50);dataSource.setInitialSize(10);dataSource.setValidationQuery("SELECT 1");dataSource.setTestOnBorrow(true);dataSource.setTimeBetweenEvictionRunsMillis(60000); //配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒dataSource.setMinEvictableIdleTimeMillis(300000); //配置一个连接在池中最小生存的时间,单位是毫秒dataSource.setConnectionInitSqls(Arrays.asList("set names utf8mb4;"));return dataSource;}