一次JDBC支持表情存储的配置过程
公司的一个项目,一开始没有考虑到内容字段支持表情,有一个接入方的内容含有表情要支持下
项目是基于Springboot的。
方案1先尝试直接配置数据库连接
shardingsphere:
datasource:
names: master
# 数据源
master:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.jdbc.Driver
url: jdbc:mysql://rm-xx.mysql.rds.aliyuncs.com/db?zeroDateTimeBehavior=convertToNull&characterEncoding=utf8mb4
username: user
password: ps
启动项目报错
2019-11-20 16:33:39.200 [ERROR] com.alibaba.druid.pool.DruidDataSource$CreateConnectionThread.run(DruidDataSource.java:2469) - create connection SQLException, url: jdbc:mysql://rm-xxx.mysql.rds.aliyuncs.com/db?zeroDateTimeBehavior=convertToNull&characterEncoding=utf8mb4, errorCode 0, state 0S100
java.sql.SQLException: Unsupported character encoding 'utf8mb4'.
查看数据库字符集
SHOW VARIABLES LIKE 'character_set%';
看到客户端连接数据库返回集都支持了utf8mb4
方案2更改服务器配置
这里网上有好多解决方案,直接配置数据库服务器的启动参数支持utf8mb4,做个demo还可以,测试环境多个部门共用一个mysql实例,更改配置的话所有的字符集都会更改;线上环境也不可行:阿里云的字符集是在新建实例的时候配置的,只能重建然后迁移数据
方案3让MySQL自动转换
还有一个现象是,使用datagrip是可以直接插入表情的,也就是可以在不更改服务器配置的情况下从客户端设置,或者直接发送表情让mysql自己识别
连接直接设置utf8,
shardingsphere:
datasource:
names: master
# 数据源
master:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.jdbc.Driver
url: jdbc:mysql://rm-xxx.mysql.rds.aliyuncs.com/db?zeroDateTimeBehavior=convertToNull&characterEncoding=utf8&serverTimezone=Asia/Shanghai
username: u
password: p
然后用接口直接把utf8传表情过去
报错:
chUpdateException: Incorrect string value: '\xF0\x9F\x98\x82\xF0\x9F...' for column 'msg_content' at row 1
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:89) ~[spring-jdbc-5.0.4.RELEASE.jar!/:5.0.4.RELEASE]
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) ~[spring-jdbc-5.0.4.RELEASE.jar!/:5.0.4.RELEASE]
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) ~[spring-jdbc-5.0.4.RELEASE.jar!/:5.0.4.RELEASE]
然后网上搜到这个https://blog.csdn.net/FHGFHFYUUGY/article/details/90292139
参考 connector-j-reference-charset 可以看到如果程序要插入 utf8mb4 字符, 需要满足以下条件: Connector/J 5.1.47 及以上版本:
1. 指定 characterEncoding 参数为 UTF8/UTF-8 即可, 新版本直接映射到 utf8mb4 编码;
2. 如果 connectionCollation 指定的排序规则不是 utf8mb4 相关的, 则 characterEncoding 参数会重写为排序规则对应的编码; Connector/J 5.1.47 以下版本:
1. 设置 MySQL 参数变量 character_set_server=utf8mb4;
2. 指定 characterEncoding 参数为 UTF8/UTF-8, jdbc 程序会进行探测是否使用 utf8mb4;
和mysql连接器版本有关,从上面保存日志看到现在使用的是5.0.4,而我们的character_set_server=utf8,所以把连接器升级到5.1.47就可以 了
<!-- Use MySQL Connector-J -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
注意更改5.1.47的默认时区
保存表情成功:
一次JDBC支持表情存储的配置过程的更多相关文章
- emoji表情存储到数据库的方法
方案1:修改数据库编码 为什么我们设置表的的字符类型为utf8却不能存放emoji呢?原来utf8可能是2或3或4个字节,而mysql的utf8是3个字节,存放一个emoji是需要4个字节的,自然不够 ...
- Spring学习五(JDBC支持)
Spring的jdbc支持 1配置db.properties,将有关JDBC的信息载入 2bean文件配置数据源,这里用e3p0作为数据源载入db.properties 3配置template的bea ...
- mysql中emoji表情存储
mysql中emoji表情存储 背景 在mysql 5.7.19,创建的数据库默认选择的编码是utf8 -- UTF-8 Unicode,因此字段默认的编码为utf-8,但在项目开发中存在一个需求:在 ...
- MySQL5.5 所支持的存储引擎
本博文的主要内容有 .存储引擎的概念 .MySQL5.5 所支持的存储引擎 .操作默认存储引擎 .选择存储引擎 与其他的数据库软件不同,MySQL数据库软件提供了一个名为存储引擎的概念,由于存储引擎是 ...
- 在Eclipse中使用JDBC访问MySQL数据库的配置方法
在Eclipse中使用JDBC访问MySQL数据库的配置方法 分类: DATABASE 数据结构与算法2009-10-10 16:37 5313人阅读 评论(10) 收藏 举报 jdbcmysql数据 ...
- Lync Server 2013中央管理存储:自动收集配置数据失败
Lync Server 2013在安装本地配置存储到配置中央管理存储的本地副本时候提示错如信息:自动收集配置数据失败. 打开Lync Shell,输入Get-CsConfigurationStoreL ...
- Spring对jdbc支持
4. Spring对jdbc支持 spring对jdbc提供了很好的支持 体现在: 1.Spring对C3P0连接池的支持很完善 2.Spring对jdbc提供了jdbcTemplate来简化jdbc ...
- nginx支持ssl双向认证配置
nginx支持ssl双向认证配置 listen 443; server_name test.com; ssl on; ssl_certificate server.crt; //server端公钥 s ...
- 高级网络功能(Docker支持的网络定制配置)
网络的高级知识,包括网络的启动和配置参数.DNS的使用配置.容器访问和端口映射的相关实现. 在一些具体场景中,Docker支持的网络定制配置,通过Linux命令来调整.补充.甚至替换Docker默认的 ...
随机推荐
- 布尔(boolean)代数趣味学习法
今天,我想出来一个学习布尔(boolean)代数的趣味方法: 比如:逻辑与(&)运算 逻辑里面就是并且形象的理解就是:从卧室里面外出,必须 卧室的门打开 “并且” 最外面的门打开,才能出去.用 ...
- Linux 文件查看
链接:https://www.nowcoder.com/questionTerminal/fb39fbeec71f43a3a16edeb0bc98f4ac 来源:牛客网 /var/log/messag ...
- css让文字,字母折行
加上如下的CSS设置,就是设定好宽度width,然后设置合适的word-wrap和word-break属性: ul li{ width: 100px; word-wrap: break-word; w ...
- Lua unpack函数用法
unpack,接受一个table做个参数,然后按照下标返回数组的所有元素 unpack lua 版本 <= 5.1 local t = {nil , 3} retunrn unpack(t) / ...
- CF1204B
CF1204B-Mislove Has Lost an Array 题意: 给你n,l,r 表示在区间1-n内至少有l个不相同的数至多有r个不相同的数,而且这些数不是1就是偶数而且每个偶数/2得到的数 ...
- node.js由浅入深教程
https://blog.csdn.net/qq_39985511/article/details/80075051
- Zookeeper系列(十一)zookeeper的Leader选举详解(核心之一)
作者:leesf 掌控之中,才会成功:掌控之外,注定失败. 出处:http://www.cnblogs.com/leesf456/p/6107600.html尊重原创,奇文共欣赏: 一.前言 前 ...
- Ubuntu18.04 server安装步骤
Ubuntu18.04 server安装步骤 1. select a language default 2. select your location default 3. configure th ...
- JAVA类定义的修饰
命名类的访问权限public.protected.friendly,private 这四个的权限, 作用域: 当前(父,超)类: 同一Package: 派生(子)类: 其他Package: publi ...
- react 闲谈
从事前端一段时间了,公司用的框架都是vue,但是不知为何对react却情有独钟,这是不是所谓的吃着碗里的看着锅里的 哈哈哈 从头好好总结下react吧 小白一个 大神勿喷 瞎说一 react是由两部分 ...