scala slick mysql utf8mb4 支持
语言 scala
sql包 slick 3.2.0
数据库 mysql
简代版 https://github.com/cclient/ScalaMysqlSync
数据库同步程序报错
java.sql.SQLException: Incorrect string value: '\xF0\x9F\x87\xB5\xF0\x9F...' for column 'content' at row
这个错误见的太多,emoji字符和utf-8不兼容所致,utf8mp4字符集支持emoji
源库(另外一家公司提供)改了表的字符集,未通知我方,从库和源库字符集不同,同步时部分字符报错
改mysql,改同步程序字符集即可
改mysql简单
ALTER TABLE table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
难在改程序的同步集,这个是个大坑,不同语言,不同访问方式的解决方式不一样
该同步服务用scala实现,引用的slick,没有任何资料,用小众的东西就是遇到坑,很多时候得独立解决
传统java项目思路 都是ini sql,不过ini方式不同。
试了两种方案
1 连接先执行,不生效
val DEST_DB = Database.forURL("jdbc:mysql://127.0.0.1:3306/table?characterEncoding=UTF-8&charset=utf8mb4", user = "root", password = "", driver = "com.mysql.jdbc.Driver")
ORIGIN_DB.run(sql"""SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci""".as[Int])
2连接初始化,这是蒙的,也不生效
val ORIGIN_DB = Database.forURL("jdbc:mysql://127.0.0.1:3306/table?charset=utf8mb4;INIT=\"SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci\"", user = "root", password = "", driver = "com.mysql.jdbc.Driver",executor = AsyncExecutor("orgindb", minThreads=, queueSize=,maxThreads=,maxConnections=),keepAliveConnection=true)
暂时走到死胡同了
查slick文档也没有任何相关资料,但是注意到一个关键字 HikariCP
这是个sql连接池
之前开发spring-boot spring-cloud 项目接触过,也碰上过HikariCP utf8mb4的相关问题
见http://www.cnblogs.com/zihunqingxin/p/8650470.html
https://github.com/brettwooldridge/HikariCP 支持 connectionInitSql 配置
spring-boot当时是通过解决
spring.datasource.hikari.connection-init-sql=SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;
既然不能直接解决utf8mb4的问题,那通过HikariCP连接池,倒可能解决该问题
配置文件设置,官网上信息很少,得参照代码实现设置
application.conf
mysql_orginal = {
connectionPool = "HikariCP"
driver = "com.mysql.jdbc.Driver"
connectionInitSql ="SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci"
url = "jdbc:mysql://127.0.0.1/table?useUnicode=true&characterEncoding=UTF-8"
keepAliveConnection = true
user = "root"
password = "123456"
numThreads = 4
poolName="mysql_orginal_pool"
}
再 val ORIGIN_DB = Database.forConfig("mysql_orginal")
编译通过,但执行报错
java.lang.ExceptionInInitializerError
at main.tables.LastActor$$anonfun$receive$.applyOrElse(last.scala:)
at akka.actor.Actor.aroundReceive(Actor.scala:)
at akka.actor.Actor.aroundReceive$(Actor.scala:)
at main.tables.LastActor.aroundReceive(last.scala:)
at akka.actor.ActorCell.receiveMessage(ActorCell.scala:)
at akka.actor.ActorCell.invoke(ActorCell.scala:)
at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:)
at akka.dispatch.Mailbox.run(Mailbox.scala:)
at akka.dispatch.Mailbox.exec(Mailbox.scala:)
at akka.dispatch.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:)
at akka.dispatch.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:)
at akka.dispatch.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:)
at akka.dispatch.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:)
Caused by: java.lang.ClassNotFoundException: slick.jdbc.hikaricp.HikariCPJdbcDataSource$
错误表示连接池生效,只是找不到相关类
引入依赖
libraryDependencies += "com.typesafe.slick" %% "slick-hikaricp" % "3.2.0"
重新编译
执行 utf8mb4 问题解决
其他参考资料
http://slick.lightbend.com/doc/3.2.0/database.html#databaseconfig
https://github.com/slick/slick/blob/6ac40e3b7f241475a122eb575f7ce0286080dd52/doc/code/application.conf
https://github.com/slick/slick/blob/4674b977d9eeaf825d57808d48dbbfc37e47858c/doc/src/config.md
scala slick mysql utf8mb4 支持的更多相关文章
- scala slick mysql 字段过多 tuple问题
原同步服务正常,因需,对方单表新增字段,超过22条 sbt assembly 编译出错 too many elements for tuple: 26, allowed: 22 scala case ...
- mysql : utf8mb4 的问题
微信呢称和QQ呢称上有很多火星文和emoji表情图片,这些数据,如果直接insert到mysql数据库,一般会报错,设置成utf8都不好使,必须改成utf8mb4编码,这二者的区别见: mysql u ...
- mysql utf8mb4
遇到的问题 有一个项目需要存储 emoji 表情.另外极少数中文在存储的时候也遇到 utf8 编码格式的数据库在储存时报错. Rails creating schema_migrations - My ...
- linux下mysql环境支持中文配置步骤
sql脚本执行前加上: CREATE DATABASE IF NOT EXISTS mydatabase DEFAULT CHARSET utf8 COLLATE UTF8_GENERAL_CI; u ...
- MySQL不支持远程连接的解决办法
如果mysql不支持远程连接,会出现提示:错误代码是1130,ERROR 1130: Host * is not allowed to connect to this MySQL server ,解决 ...
- 4、什么是事务?MySQL如何支持事务?
什么是事务? 事务是由一步或几步数据库操作序列组成逻辑执行单元,这系列操作要么全部执行,要么全部放弃执行.程序和事务是两个不同的概念.一般而言:一段程序中可能包含多个事务.(说白了就是几步的数据库操作 ...
- 什么是事务?MySQL如何支持事务?
什么是事务? 事务是由一步或几步数据库操作序列组成逻辑执行单元,这系列操作要么全部执行,要么全部放弃执行.程序和事务是两个不同的概念.一般而言:一段程序中可能包含多个事务.(说白了就是几步的数据库操作 ...
- 从PHP5到PHP7的注意事项——PHP7全面删除Mysql扩展支持
PHP删除了一些函数,其中是吓人的是两个: 1. ereg_* 系列的正则函数 2. mysql_* 系列的数据库连接函数 PHP7全面删除Mysql扩展支持,原本的mysql_*系列函数将在mysq ...
- Spark使用Java、Scala 读取mysql、json、csv数据以及写入操作
Spark使用Java读取mysql数据和保存数据到mysql 一.pom.xml 二.spark代码 2.1 Java方式 2.2 Scala方式 三.写入数据到mysql中 四.DataFrame ...
随机推荐
- part11 Vue项目接口联调//真机测试
何为项目接口联调? 前端代码编译好了 后端接口写好了 我们就需要去掉前端模拟数据干掉 用后端提供的数据.进行前后端的一个调试 如何联调? config目录下面 index.js 文件 dev 中pr ...
- Windows 远程桌面连接 CentOS7 (xrdp)
Windows 远程桌面连接 CentOS7 (xrdp) 前提: CentOS安装桌面,如果无桌面,请执行: yum -y groups install "GNOME Desktop&qu ...
- UVA 11019 二维匹配 AC自动机
这个题目要求在一个大矩阵里面匹配一个小矩阵,是AC自动机的灵活应用 思路是逐行按普通AC自动机匹配,用过counts[i][j]记录一下T字符矩阵以i行j列为开头的与P等大的矩阵区域 有多少行已经匹配 ...
- 18个Java8日期处理的实践,太有用了
专注于Java领域优质技术,欢迎关注 作者:胖先森 Java 8 推出了全新的日期时间API,在教程中我们将通过一些简单的实例来学习如何使用新API. Java处理日期.日历和时间的方式一直为社区所诟 ...
- cafe-ssd數據集訓練
训练方式::https://blog.csdn.net/xiao_lxl/article/details/79106837 caffe-ssd训练自己的数据集 https://blog.csdn.ne ...
- MAVEN报错Could not get the value for parameter compilerId for
Maven:Could not get the value for parameter compilerId for plugin execution default-compile..... 前两天 ...
- html_js_jq_css
// ----- JQ $(function(){$(div').bind('mouseout mouseover', function () {// 移入和移出分别执行一次alert('bind 可 ...
- leetcode中二分查找的具体应用
给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标值,返回 [ ...
- 01 语言基础+高级:1-6 集合_day02【Collection、泛型】
day02[Collection.泛型] 主要内容 Collection集合 迭代器 增强for 泛型 教学目标 能够说出集合与数组的区别 说出Collection集合的常用功能 能够使用迭代器对集合 ...
- 第04项目:淘淘商城(SpringMVC+Spring+Mybatis) 的学习实践总结【第一天】
本人做过一年的MATLAB编程和简单维护过VB和C++的项目.是跟着网上获得的黑马的Java双元视频课来自学入门Java知识和常用框架的使用. 淘淘商城(SpringMVC+Spring+Mybati ...