解决【Incorrect string value: '\\xF0\\x9F\\x8F\\x86' for column ...】

Posted by aclyyx on 09-15,2018

项目中程序(Java、Spring)和数据库(MySQL)原本使用都是UTF-8的编码,在插入【emoji表情字符】时出现了标题中的错误信息。解决方法如下

修改 MySQL 配置

修改 MySQL 配置文件,添加以下内容

[mysqld]
character-set-server=utf8mb4

[mysql]
default-character-set=utf8mb4

修改表的字符集

同时修改表的字符集信息

alter table TABLE_NAME convert to character set utf8mb4 collate utf8mb4_bin; 

修改程序中的字符集

程序的数据库链接字符串中不要写characterEncoding=utf8,否则会不适用utf8mb4字符集。

Spring的数据源配置中如下

<!-- 数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
	<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
	<property name="url" value="jdbc:mysql://${${data-source.prefix}.data-source.host-name}:3306/${${data-source.prefix}.data-source.db-name}?characterEncoding=utf8&autoReconnect=true&failOverReadOnly=false&maxReconnects=10&allowMultiQueries=true" />
	<property name="username" value="${${data-source.prefix}.data-source.username}" />
	<property name="password" value="${${data-source.prefix}.data-source.password}" />
	<property name="maxActive" value="150" />
	<property name="maxIdle" value="2" />
	<property name="testOnBorrow" value="true" />
	<property name="testOnReturn" value="true" />
	<property name="testWhileIdle" value="true" />
	<property name="validationQuery" value="select 1" />
	<!-- 此配置用于在创建Connection对象时执行指定的初始化sql -->
	<property name="connectionInitSqls">
		<list>
			<value>set names 'utf8mb4'</value>
		</list>
	</property>
</bean>

参考

mysql中Incorrect string value乱码问题解决方案

该错误的解决办法:Incorrect string value: '\xF0\x9F...' for column 'XXX' at row 1