语言  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

数据库同步程序报错

  1. java.sql.SQLException: Incorrect string value: '\xF0\x9F\x87\xB5\xF0\x9F...' for column 'content' at row

这个错误见的太多,emoji字符和utf-8不兼容所致,utf8mp4字符集支持emoji

源库(另外一家公司提供)改了表的字符集,未通知我方,从库和源库字符集不同,同步时部分字符报错

改mysql,改同步程序字符集即可

改mysql简单

  1. ALTER TABLE table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

难在改程序的同步集,这个是个大坑,不同语言,不同访问方式的解决方式不一样

该同步服务用scala实现,引用的slick,没有任何资料,用小众的东西就是遇到坑,很多时候得独立解决

传统java项目思路 都是ini sql,不过ini方式不同。

试了两种方案

1 连接先执行,不生效

  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")
  2.  
  3. ORIGIN_DB.run(sql"""SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci""".as[Int])

2连接初始化,这是蒙的,也不生效

  1. 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当时是通过解决

  1. 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

  1. 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"
    }
  1. val ORIGIN_DB = Database.forConfig("mysql_orginal")

编译通过,但执行报错

  1. java.lang.ExceptionInInitializerError
  2. at main.tables.LastActor$$anonfun$receive$.applyOrElse(last.scala:)
  3. at akka.actor.Actor.aroundReceive(Actor.scala:)
  4. at akka.actor.Actor.aroundReceive$(Actor.scala:)
  5. at main.tables.LastActor.aroundReceive(last.scala:)
  6. at akka.actor.ActorCell.receiveMessage(ActorCell.scala:)
  7. at akka.actor.ActorCell.invoke(ActorCell.scala:)
  8. at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:)
  9. at akka.dispatch.Mailbox.run(Mailbox.scala:)
  10. at akka.dispatch.Mailbox.exec(Mailbox.scala:)
  11. at akka.dispatch.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:)
  12. at akka.dispatch.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:)
  13. at akka.dispatch.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:)
  14. at akka.dispatch.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:)
  15. Caused by: java.lang.ClassNotFoundException: slick.jdbc.hikaricp.HikariCPJdbcDataSource$

错误表示连接池生效,只是找不到相关类

引入依赖

  1. 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. Cracking Digital VLSI Verification Interview 第三章

    目录 Programming Basics Basic Programming Concepts Object Oriented Programming Concepts UNIX/Linux Pro ...

  2. A4纸表格打印

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. 数组分组(DP)

    一个长度为n的数组a,我们可以把它分成任意组,每一组是一段连续的区间. 比如数组1,2,3,4,5可以分成(1,2),(3,4,5)两个组.每个分组都有一个权值,这个权值就是分组里面每个数的乘积对10 ...

  4. jquery鼠标键盘悬停事件,形变动画和淡入淡出

    鼠标和键盘悬停 <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  5. SQL基础教程(第2版)第5章 复杂查询:5-1 视图和表

    本章将以此前学过的SELECT语句,以及嵌套在SELECT语句中的视图和子查询等技术为中心进行学习.由于视图和子查询可以像表一样进行使用,因此如果能恰当地使用这些技术,就可以写出更加灵活的 SQL 了 ...

  6. jstl中遍历Map

    在jstl中遍历Map和遍历List与数组一样,都是使用forEach标签. 例子: <%@ page import="java.util.Map" %> <%@ ...

  7. javaweb03 javaservlet基础一

    1.使用JavaEE版的eclipse开发动态的WEB工程(JavaWEB 项目)1).把开发选项切换到JavaEE2).可以在window -> Show View 中找到Package Ex ...

  8. Java 知识点(一)

    博主对 Java知识点的整理基于 c语言,整理内容为 Java的重点及与 c语言的差异点或编程通要知识点.水平有限,欢迎指正.(参考书籍<Java 核心技术 卷Ⅰ>) Java 的类名:名 ...

  9. 题解【[BJOI2012]算不出的等式】

    题目背景emmm \[\text{首先特判掉p=q时的情况(ans = }p^2-1\text{)}\] \[\text{构造函数}f(k) = \left\lfloor \frac{kq}{p}\r ...

  10. for-each用法误区(不能改变数组元素值)

    代码例程: /**  * 数据加密传输  */ import java.util.Scanner; public class secretPass {     public static void m ...