Mysql实例MySQL插入emoji表情失败问题的解决方法
《Mysql实例MySQL插入emoji表情失败问题的解决方法》要点: MYSQL应用前言 MYSQL应用之前一直认为UTF-8是万能的字符集问题办理方案,直到最近遇到这个问题.最近在做新浪微博的爬虫,在存库的时候发现只要保持emoji表情,就回抛出以下异常: MYSQL应用
Incorrect string value: 'xF0x90x8Dx83xF0x90...'
MYSQL应用众所周知UTF-8是3个字节,其中已经包括我们日常能见过的绝大多数字体. 但3个字节远远不够容纳所有的文字,所以便有了utf8mb4,utf8mb4是utf8的超集,占4个字节,向下兼容utf8. 我们日常用的emoji表情就是4个字节了. MYSQL应用所以在此我们像utf8的数据表插入数据就会报出 MYSQL应用Google一下很容易就找到了解决方案,具体解决方法是如下: MYSQL应用一、修改数据表的字符集为utf8mb4 MYSQL应用这点很简单,修改语句网上找一大堆,不过建议重新建表,使用 MYSQL应用二、MySQL数据库版本要5.5.3及以上 MYSQL应用网络上所有的文章都说明要MySQL 5.5.3以上的版本才支持utf8mb4,不过我使用的数据库版本为5.5.18,最终仍能办理问题,所以同学们不要急着找运维哥哥升级数据库先,先试试能不能自己办理问题. MYSQL应用三、修改数据库配置文件/etc/my.cnf并重启mysql服务 MYSQL应用主要是修改数据库的默认字符集,以及连接,查询的字符集,[Mysql支持emoji 表情符号 升级编码为UTF8MB4][1] 这篇文章有详细的设置办法,[深入Mysql字符集设置][2] 这篇文章有其中设置的各个字符集的作用,大家可以科普下. MYSQL应用四、升级MySQL Connector到5.1.21及以上 MYSQL应用以上所有的操作,最关键的是步骤3,修改数据库的配置文件,其中大概修改了 MYSQL应用
[client]
# 客户端来源数据的默认字符集
default-character-set = utf8mb4
[mysqld]
# 服务端默认字符集
character-set-server=utf8mb4
# 连接层默认字符集
collation-server=utf8mb4_unicode_ci
[mysql]
# 数据库默认字符集
default-character-set = utf8mb4
MYSQL应用这些配置指定了数据从客户端到服务端所经过的一条条管道使用的字符集,其中每一个管道出现问题都可能会导致插入失败或者乱码. MYSQL应用但很多时候,线上的数据库是不能随便修改数据库文件的,所以我们的运维同学很果断的回绝了我修改数据库配置文件的哀求(T_T) MYSQL应用所以就只能用代码办理了,一开始是准备从JDBC连接时候就指定使用的字符集处下手. MYSQL应用
jdbc:mysql://localhost:3306/ding?characterEncoding=UTF-8
MYSQL应用主要把UTF-8修改为utf8mb4对于的Java Style Charset字符串应该就能办理问题吧? MYSQL应用不过很遗憾的是,Java JDBC并不存在utf8mb4对于的字符集. 使用UTF-8的时候可以兼容urf8mb4并自动转换字符集. MYSQL应用For example,to use 4-byte UTF-8 character sets with Connector/J,configure the MySQL server with character_set_server=utf8mb4,and leave characterEncoding out of the Connector/J connection string. Connector/J will then autodetect the UTF-8 setting. C [MySQL:Using Character Sets and Unicode][3] MYSQL应用后来科普了一下,在每一次查询哀求的时候,可以显式的指定使用的字符集,使用 MYSQL应用目前的解决方法是,在需要插入utf8mb4的时候,显示地调用执行 MYSQL应用
jdbcTemplate.execute("set names utf8mb4");
jdbcTempalte.execute("...");
MYSQL应用需要注意的是,我们在使用一下ORM框架的时候,因为性能优化原因,框架会延迟提交,除非事务结束或者用户主动调用强制提交,负责执行的 MYSQL应用在这里我使用的是myBatis,以MessageDao为例 MYSQL应用
// MessageDao
public interface MessageDao {
@Update("set names utf8mb4")
public void setCharsetToUtf8mb4();
@Insert("insert into tb_message ......")
public void insert(Message msg);
}
// test code
SqlSession sqlSession = sqlSessioFactory.openSession();
messageDao = sqlSession.getMapper(MessageDao.class);
messageDao.setCharsetToUtf8mb4();
// 强制提交
sqlSession.commit();
messageDao.insert(message);
MYSQL应用至此,问题便办理了.. MYSQL应用哎,如果世事能那么顺利就好了,在项目中,mybatis是实例是交由Spring去管理的,也就是说我拿不到sqlSession,也就是强制提交不了. 并且因为Spring事务框架的限制,他并不允许用户显式调用强制提交. 目前还在纠结这个问题. MYSQL应用有两个办理思路:
MYSQL应用总结 MYSQL应用以上就是这篇文章的全部内容了,待有时间再实验一下以上两种方案.希望本文的内容对大家的学习或者工作能带来一定的赞助,如果有疑问大家可以留言交流,谢谢大家对编程之家PHP的支持. 编程之家培训学院每天发布《Mysql实例MySQL插入emoji表情失败问题的解决方法》等实战技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培养人才。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- Mysql必读从创建数据库到存储过程与用户自定义函数的小感
- Mysql入门浅谈innodb_autoinc_lock_mode的表现形式和选值参
- MYSQL教程详解Ubuntu Server下启动/停止/重启MySQL数据库的
- mysql远程授权
- Mysql实例MYSQL之插入极限分析
- mysql中You can't specify target table for update in
- MySQL-Python安装 – 无法构建鸡蛋
- Mysql学习在MySQL中使用JOIN语句进行连接操作的详细教程
- Mysql学习MySQL优化之表结构优化的5大建议(数据类型选择讲
- Linux下系统性能调优工具Perf,经典实用