语言  scala

sql包  slick 3.2.0

数据库  mysql

https://stackoverflow.com/questions/36741141/scala-slick-jdbc-encoding-configuration-with-typesafe-config/50153514

简代版  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连接池,倒可能解决该问题

配置文件设置,官网上信息很少,得参照代码实现设置

https://github.com/slick/slick/blob/master/slick-hikaricp/src/main/scala/slick/jdbc/hikaricp/HikariCPJdbcDataSource.scala#L13

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 支持的更多相关文章

  1. scala slick mysql 字段过多 tuple问题

    原同步服务正常,因需,对方单表新增字段,超过22条 sbt assembly 编译出错 too many elements for tuple: 26, allowed: 22 scala case ...

  2. mysql : utf8mb4 的问题

    微信呢称和QQ呢称上有很多火星文和emoji表情图片,这些数据,如果直接insert到mysql数据库,一般会报错,设置成utf8都不好使,必须改成utf8mb4编码,这二者的区别见: mysql u ...

  3. mysql utf8mb4

    遇到的问题 有一个项目需要存储 emoji 表情.另外极少数中文在存储的时候也遇到 utf8 编码格式的数据库在储存时报错. Rails creating schema_migrations - My ...

  4. linux下mysql环境支持中文配置步骤

    sql脚本执行前加上: CREATE DATABASE IF NOT EXISTS mydatabase DEFAULT CHARSET utf8 COLLATE UTF8_GENERAL_CI; u ...

  5. MySQL不支持远程连接的解决办法

    如果mysql不支持远程连接,会出现提示:错误代码是1130,ERROR 1130: Host * is not allowed to connect to this MySQL server ,解决 ...

  6. 4、什么是事务?MySQL如何支持事务?

    什么是事务? 事务是由一步或几步数据库操作序列组成逻辑执行单元,这系列操作要么全部执行,要么全部放弃执行.程序和事务是两个不同的概念.一般而言:一段程序中可能包含多个事务.(说白了就是几步的数据库操作 ...

  7. 什么是事务?MySQL如何支持事务?

    什么是事务? 事务是由一步或几步数据库操作序列组成逻辑执行单元,这系列操作要么全部执行,要么全部放弃执行.程序和事务是两个不同的概念.一般而言:一段程序中可能包含多个事务.(说白了就是几步的数据库操作 ...

  8. 从PHP5到PHP7的注意事项——PHP7全面删除Mysql扩展支持

    PHP删除了一些函数,其中是吓人的是两个: 1. ereg_* 系列的正则函数 2. mysql_* 系列的数据库连接函数 PHP7全面删除Mysql扩展支持,原本的mysql_*系列函数将在mysq ...

  9. Spark使用Java、Scala 读取mysql、json、csv数据以及写入操作

    Spark使用Java读取mysql数据和保存数据到mysql 一.pom.xml 二.spark代码 2.1 Java方式 2.2 Scala方式 三.写入数据到mysql中 四.DataFrame ...

随机推荐

  1. windows FTP上传

    TCHAR tcFileName[MAX_PATH * 4] = {L"visio2010永久安装密钥.txt"}; TCHAR tcName[MAX_PATH * 4] = {0 ...

  2. cat <<EOF> file

    .多行导入文件(新建文件或者覆盖文件内容)   cat << EOF > abcd.txt Hello! This is a test file! Test for cat and ...

  3. 刷题46. Permutations

    一.题目说明 题目是46. Permutations,给一组各不相同的数,求其所有的排列组合.难度是Medium 二.我的解答 这个题目,前面遇到过类似的.回溯法(树的深度优先算法),或者根据如下求解 ...

  4. arp攻击 (可查看同一局域网他人手机照片)

    国家法律一定要遵守,知识要用在对的地方. 本贴只为了和大家交流学习,请勿用在其他地方,损害任何人的利益. 今天我,来说一下arp攻击的原理和教程 原理什么的还是自行百度好,因为专业的说明是严谨而又经得 ...

  5. maven中的groupId和artifactId 区分

    原文地址:https://blog.csdn.net/snowin1994/article/details/53024871/ maven中的groupId和artifactId 区分 groupid ...

  6. .net APP接口

    编写APP接口首先要搭建测试环境,在实际开发中APP对于大多数公司来说都是选择外包,并不是公司内部人员负责,遇到事情不可能时时进行沟通和交流,也不能写每一个接口都要双方及时确认.个人经历是双方确认AP ...

  7. svnkit-常用api

    0.功能列表 svnkit功能列表 1.递归获取指定目录下目录和文件,以树形展示[svn Update] 2.获取指定文件和属性(版本号.作者.日期.文件类型) 3.获取指定文件或目录的历史记录(版本 ...

  8. Linux-常见信号介绍

    1.SIGINT           2 Ctrl + C时OS送给前台进程组中每个进程 2.SIGABRT             6              调用abort函数,进程异常终止 3 ...

  9. 深入分析Java反射(二)-数组和枚举

    前提 Java反射的API在JavaSE1.7的时候已经基本完善,但是本文编写的时候使用的是Oracle JDK11,因为JDK11对于sun包下的源码也上传了,可以直接通过IDE查看对应的源码和进行 ...

  10. 饭卡(DP)

    电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额. 如果购买一个商品之前,卡上的剩余金额大于或等于5元,就一定可以购买成功(即使购买后卡上余额为负),否则无法购买(即使金额足够).所以大 ...