美文网首页
MySql使用utf8mb4 即解决:java.sql.SQLE

MySql使用utf8mb4 即解决:java.sql.SQLE

作者: 二鸭儿 | 来源:发表于2020-08-15 17:27 被阅读0次

    参考链接一

    一、问题

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

    若您使用云数据库这里以腾讯云数据库为例:

    image.png

    修改如上字符集

    第三步:重启数据库

    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以后的版本。

    相关文章

      网友评论

          本文标题:MySql使用utf8mb4 即解决:java.sql.SQLE

          本文链接:https://www.haomeiwen.com/subject/dxbadktx.html