MySql使用utf8mb4

一、问题

最近项目中使用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表情

二、原因

  1. 一个ASCII字符占用1个字节,一个汉字占用3个字节;
  2. 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;
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以后的版本。

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值