一、问题
最近项目中使用Mysql5.5.3+时(使用的是utf8字符集),在插入HTML文本(insert into...)至数据时时报如下错误:
java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x94' for column 'name' at row 1
以上错误是因为HTML文本中包含了MySql字符集不支持的字符,例如:Emoji表情
二、原因
- 一个ASCII字符占用1个字节,一个汉字占用3个字节;
- MySql的utf8编码最多3个字节,算不上真正的utf8字符集。在MySql5.5.3的版本增加了utf8mb4编码集,专门用于兼容4个字节的unicode。在MySql中utf8mb4是utf8的超集,除了修改数据库的编码集为utf8mb4外不需要做其他的修改。
三、解决方案
第一步:检查版本
查询版本语句:
select version();
第二步:修改MySql配置文件
打开mysql配置文件mysql/my.cnf或mysql/my.ini, 并且添加如下内容:
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
character-set-client-handshake=FALSE
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
若您使用云数据库这里以腾讯云数据库为例:
修改如上字符集
第三步:重启数据库
1、Windows请到服务管理界面重新启动MySql服务:services.msc
2、Linux请执行命令:/etc/init.d/mysql restart
第四步:检查数据库配置
执行查看数据库字符集命令:
SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%';
+--------------------------+--------------------+
| Variable_name | Value |
+--------------------------+--------------------+
|| character_set_client | utf8mb4
|| character_set_connection | utf8mb4
|| character_set_database | utf8mb4
|| character_set_filesystem | binary
|| character_set_results | utf8mb4
|| character_set_server | utf8mb4
|| character_set_system | utf8
|| collation_connection | utf8mb4_unicode_ci
|| collation_database | utf8mb4_unicode_ci
|| collation_server | utf8mb4_unicode_ci
+--------------------------+--------------------+
必须保证:
character_set_client/character_se_connection/character_set_database/character_set_results/character_set_server为utf8mb4。
第五步:更新客户端配置文件
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/database?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=true
jdbc.username=username
jdbc.password=password
注意:jdbc.url的内容,characterEncoding=utf8可以配自动识别为utf8bm4
第六步:修改数据库、表和列的字符集SQL语句:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
已存在数据库 可通过此语句修改utf8 为 utf8mb4
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE table_name table_name CHANGE column_name VARCHAR(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
第七步:修改应用连接字符串(druid):
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="driverClassName" value="${jdbc-driver}"/>
<property name="url" value="${jdbc-url}"/>
<property name="username" value="${jdbc-user}"/>
<property name="password" value="${jdbc-password}"/>
<property name="filters" value="stat"/>
<property name="maxActive" value="20"/>
<property name="initialSize" value="1"/>
<property name="maxWait" value="60000"/>
<property name="minIdle" value="1"/>
<property name="timeBetweenEvictionRunsMillis" value="3000"/>
<property name="minEvictableIdleTimeMillis" value="300000"/>
<property name="validationQuery" value="SELECT 'x'"/>
<property name="testWhileIdle" value="true"/>
<property name="testOnBorrow" value="false"/>
<property name="testOnReturn" value="false"/>
<property name="poolPreparedStatements" value="true"/>
<property name="maxPoolPreparedStatementPerConnectionSize" value="20"/>
**<property name="connectionInitSqls" value="set names utf8mb4;"/> **// 必须添加-关键代码
</bean>
注意:mysql-connector-java驱动在5.1.13之前是不支持utf8mb4,请使用5.1.13以后的版本。