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。

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

  • 相关阅读:
    准备 FRM 考试——方法、工具与教训
    930. 和相同的二元子数组 前缀和
    1906. 查询差绝对值的最小值 前缀和
    剑指 Offer 37. 序列化二叉树 二叉树 字符串
    815. 公交路线 BFS
    518. 零钱兑换 II dp 完全背包
    1049. 最后一块石头的重量 II dp
    5779. 装包裹的最小浪费空间 二分
    5778. 使二进制字符串字符交替的最少反转次数 字符串 滑动窗口
    474. 一和零 dp
  • 原文地址:https://www.cnblogs.com/flywang/p/8514201.html
Copyright © 2011-2022 走看看