zoukankan      html  css  js  c++  java
  • mysql不支持emoji表情的问题的解决方法

     

    最近财神圈项目集成微信登录功能的过程中,当保存用户有昵称含有表情符号时后台服务抛出异常,原来是数据库默认字符集不支持emoji表情字符。找到问题的原因后,因为之前也没有遇到过这样的问题,也没思路,迅速百度大神找了一大堆资料来,原来仅只要将数据库及相关的表和表字段设置为utfmb84即支持emoji表情的。

    问题的原因是数据库中使用的字符编码为UTF-8,这种编码有可能是两个、三个、四个字节。Emoji表情是4个字节,而mysql的utf8编码最多3个字节,所以数据插不进去,而utfmb64是支持四个字节的。所以解决方案就是:将mysql编码从utf8转换成utf8mb4。

    现将解决的思路和步骤分享一下,为了改过之前写文章过于草率,尽量将所找的资料和我的实战经验写得完整一下以示尊重读者。

    1,检测你的数据库版本,数据库版本需>=5.5.3版本.

    如何察看mysql版本如下图,我安装的是mysql下的一个开源分支mariadb,版本10.0对应的是mysql版本5.6以上,所以是支持的。

    2,如果你的mysql服务正在启动中,请右击我的电脑-管理-服务,关闭mysql server这个服务。

    3,设置数据库默认支持字符集utf8mb4,

    找到mysql安装目录下的my.cnf或者mysql.ini,修改my.cnf或mysql.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'

    4,重启mysql server

    检查字符集

    mysq>SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';

     5,存在的数据库的字符集是utf8的,如果要支持utf8mb64则需要将已经存在的数据库、表、表字段类型修改成支持utf8mb64.

    修改数据库字符集:

    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 CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

    6,这步可有可无,前提是如果使用到 spring boot的连接池,请在spring boot 的配置文件application.properties设置连接使用utf8mb64

    spring.mysql.datasource.init-sql=SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci

    7,设置连接驱动的JDBC_URL

    修改如jdbc:mysql://localhost:3306/db?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&autoReconnect=true
    这里请注意如果数据库版本大于5.1.13驱动程序connector不能加characterEncoding=utf8,一定要去掉characterEncoding=utf8。

    以上步骤测试过很多表的相关字段均都完美解决。

     
     
  • 相关阅读:
    BloomFilter——读数学之美札记
    线性时间求最长回文子串
    python之装饰器详解
    多线程快速排序(思考)
    搬家
    webapp用户身份认证方案 JSON WEB TOKEN 实现
    Java多线程问题总结
    synchronized的4种用法
    线程池的工作原理及使用示例
    Http 请求 GET和POST的区别
  • 原文地址:https://www.cnblogs.com/fengjian2016/p/12253561.html
Copyright © 2011-2022 走看看