DB migration from H2 to MariaDB fails with UTF8mb3 error

Hello,

We are exploring the use of Metabase for some business projects so have very little experience with it so far.

Essentially, we have a problem when attempting to migrate the default H2 database to our MariaDB server. Despite Metabase's own documentation instructing us to configure the target DB as utf8mb4, the migration fails, reporting apparent collation mismatch errors, which oddly relate to utf8mb3.

Linux: Rocky 9.3
Metabase Version: Latest Community Edition (downloaded 2 days ago)
Metabase Type: JAR
Java version: 21
MariaDB Version: 10.6.7 (on separate server)
MariaDB DB Type: Charset: utf8mb4 / Collation: utf8mb4_unicode_ci
Upgrade Command Run: java -DMB_DB_TYPE=mysql -DMB_DB_CONNECTION_URI="jdbc:mysql://it-db-server-2.my-domain.local:3306/metabase?user=metabase&password=1234567!" -jar metabase.jar load-from-h2 metabase.db

Here's the full output:

2024-03-20 19:29:25,892 INFO metabase.util :: Maximum memory available to JVM: 912.0 MB
2024-03-20 19:29:29,901 INFO util.encryption :: Saved credentials encryption is DISABLED for this Metabase instance. 🔓
 For more information, see https://metabase.com/docs/latest/operations-guide/encrypting-database-details-at-rest.html
2024-03-20 19:29:40,415 INFO driver.impl :: Registered abstract driver :sql  🚚
2024-03-20 19:29:40,445 INFO driver.impl :: Registered abstract driver :sql-jdbc (parents: [:sql]) 🚚
2024-03-20 19:29:40,469 INFO metabase.util :: Load driver :sql-jdbc took 214.3 ms
2024-03-20 19:29:40,471 INFO driver.impl :: Registered driver :h2 (parents: [:sql-jdbc]) 🚚
2024-03-20 19:29:40,802 INFO driver.impl :: Registered driver :mysql (parents: [:sql-jdbc]) 🚚
2024-03-20 19:29:40,862 INFO driver.impl :: Registered driver :postgres (parents: [:sql-jdbc]) 🚚
2024-03-20 19:29:43,544 INFO metabase.core ::
Metabase v0.49.0 (46c668b)

Copyright © 2024 Metabase, Inc.

Metabase Enterprise Edition extensions are NOT PRESENT.
2024-03-20 19:29:43,769 INFO driver.impl :: Registered abstract driver :metabase.driver.sql-jdbc.execute.legacy-impl/use-legacy-classes-for-read-and-set  🚚
2024-03-20 19:29:43,779 INFO driver.impl :: Registered abstract driver :metabase.driver.sql.query-processor.empty-string-is-null/empty-string-is-null  🚚
2024-03-20 19:29:44,424 INFO cmd.copy :: Set up h2 source database and run migrations...
2024-03-20 19:29:44,427 INFO db.setup :: Verifying h2 Database Connection ...
2024-03-20 19:29:45,234 INFO db.setup :: Successfully verified H2 2.1.214 (2022-06-13) application database connection. ✅
2024-03-20 19:29:45,236 INFO db.setup :: Checking if a database downgrade is required...
2024-03-20 19:29:46,674 INFO db.setup :: Running Database Migrations...
2024-03-20 19:29:46,675 INFO db.setup :: Setting up Liquibase...
2024-03-20 19:29:47,167 INFO db.setup :: Liquibase is ready.
2024-03-20 19:29:47,168 INFO db.liquibase :: Checking if Database has unrun migrations...
2024-03-20 19:29:47,983 INFO db.liquibase :: No unrun migrations found.
2024-03-20 19:29:47,984 INFO db.setup :: Database Migrations Current ...  ✅
2024-03-20 19:29:47,985 INFO metabase.util :: Database setup took 3.6 s
2024-03-20 19:29:47,986 INFO cmd.copy :: [OK]
2024-03-20 19:29:47,987 INFO cmd.copy :: Set up mysql target database and run migrations...
2024-03-20 19:29:47,991 INFO db.setup :: Verifying mysql Database Connection ...
2024-03-20 19:29:48,166 INFO db.setup :: Successfully verified MariaDB 10.6.12-MariaDB-log application database connection. ✅
2024-03-20 19:29:48,167 INFO db.setup :: Checking if a database downgrade is required...
2024-03-20 19:29:48,585 INFO db.setup :: Running Database Migrations...
2024-03-20 19:29:48,586 INFO db.setup :: Setting up Liquibase...
2024-03-20 19:29:48,858 INFO db.setup :: Liquibase is ready.
2024-03-20 19:29:48,859 INFO db.liquibase :: Checking if Database has unrun migrations...
2024-03-20 19:29:49,836 INFO db.liquibase :: Database has unrun migrations. Checking if migraton lock is taken...
2024-03-20 19:29:49,857 INFO db.liquibase :: No migration lock found.
2024-03-20 19:29:50,296 INFO db.liquibase :: Running 275 migrations ...
2024-03-20 19:29:54,320 INFO impl.StdSchedulerFactory :: Using default implementation for ThreadExecutor
2024-03-20 19:29:54,344 INFO core.SchedulerSignalerImpl :: Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl
2024-03-20 19:29:54,344 INFO core.QuartzScheduler :: Quartz Scheduler v.2.3.2 created.
2024-03-20 19:29:54,347 INFO jdbcjobstore.JobStoreTX :: Using db table-based data access locking (synchronization).
2024-03-20 19:29:54,350 INFO jdbcjobstore.JobStoreTX :: JobStoreTX initialized.
2024-03-20 19:29:54,351 INFO core.QuartzScheduler :: Scheduler meta-data: Quartz Scheduler (v2.3.2) 'MetabaseScheduler' with instanceId 'g0001111710962994324'
  Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally.
  NOT STARTED.
  Currently in standby mode.
  Number of jobs executed: 0
  Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads.
  Using job-store 'org.quartz.impl.jdbcjobstore.JobStoreTX' - which supports persistence. and is clustered.

2024-03-20 19:29:54,352 INFO impl.StdSchedulerFactory :: Quartz scheduler 'MetabaseScheduler' initialized from default resource file in Quartz package: 'quartz.properties'
2024-03-20 19:29:54,352 INFO impl.StdSchedulerFactory :: Quartz scheduler version: 2.3.2
2024-03-20 19:29:54,400 INFO core.QuartzScheduler :: Scheduler MetabaseScheduler_$_g0001111710962994324 started.
2024-03-20 19:29:54,417 INFO core.QuartzScheduler :: Scheduler MetabaseScheduler_$_g0001111710962994324 shutting down.
2024-03-20 19:29:54,417 INFO core.QuartzScheduler :: Scheduler MetabaseScheduler_$_g0001111710962994324 paused.
2024-03-20 19:29:54,419 INFO core.QuartzScheduler :: Scheduler MetabaseScheduler_$_g0001111710962994324 shutdown complete.
2024-03-20 19:29:54,992 INFO db.custom-migrations :: No forward migration for DowngradeDashboardTab
2024-03-20 19:29:57,866 ERROR liquibase.changelog :: ChangeSet migrations/001_update_migrations.yaml::v49.2024-01-22T11:52:00::qnkhuat encountered an exception.

UPDATE SUMMARY
Run:                        275
Previously run:               0
Filtered out:                 5
-------------------------------
Total change sets:          280


FILTERED CHANGE SETS SUMMARY
DBMS mismatch:                5

2024-03-20 19:29:57,955 ERROR cmd.copy :: [FAIL]

clojure.lang.ExceptionInfo: ERROR Set up mysql target database and run migrations...: liquibase.exception.LiquibaseException: liquibase.exception.MigrationFailedException: Migration failed for changeset migrations/001_update_migrations.yaml::v49.2024-01-22T11:52:00::qnkhuat:
     Reason: clojure.lang.ExceptionInfo: (conn=79231) Illegal mix of collations (utf8mb3_general_ci,COERCIBLE) and (utf8mb3_unicode_ci,COERCIBLE) for operation '=' {:toucan2/context-trace [["execute SQL with class com.mchange.v2.c3p0.impl.NewProxyConnection" {:toucan2.jdbc.query/sql-args ["UPDATE revision\n               SET object = JSON_SET(\n                   object,\n                   '$.type',\n                   CASE\n                       WHEN JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) = 'true' THEN 'model'\n                       ELSE 'question'\n                   END)\n               WHERE model = 'Card' AND JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) IS NOT NULL;;"]}] ["resolve connection" {:toucan2.connection/connectable org.mariadb.jdbc.MariaDbConnection}] ["resolve connection" {:toucan2.connection/connectable nil}] {:toucan2.pipeline/rf #object[clojure.core$map$fn__5931$fn__5932 0x75b34b86 "clojure.core$map$fn__5931$fn__5932@75b34b86"]} ["with compiled query" {:toucan2.pipeline/compiled-query ["UPDATE revision\n               SET object = JSON_SET(\n                   object,\n                   '$.type',\n                   CASE\n                       WHEN JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) = 'true' THEN 'model'\n                       ELSE 'question'\n                   END)\n               WHERE model = 'Card' AND JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) IS NOT NULL;;"]}] ["with built query" {:toucan2.pipeline/built-query ["UPDATE revision\n               SET object = JSON_SET(\n                   object,\n                   '$.type',\n                   CASE\n                       WHEN JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) = 'true' THEN 'model'\n                       ELSE 'question'\n                   END)\n               WHERE model = 'Card' AND JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) IS NOT NULL;;"]}] ["with resolved query" {:toucan2.pipeline/resolved-query ["UPDATE revision\n               SET object = JSON_SET(\n                   object,\n                   '$.type',\n                   CASE\n                       WHEN JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) = 'true' THEN 'model'\n                       ELSE 'question'\n                   END)\n               WHERE model = 'Card' AND JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) IS NOT NULL;;"]}] ["with parsed args" {:toucan2.pipeline/query-type :toucan.result-type/*, :toucan2.pipeline/parsed-args {:connectable nil, :queryable ["UPDATE revision\n               SET object = JSON_SET(\n                   object,\n                   '$.type',\n                   CASE\n                       WHEN JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) = 'true' THEN 'model'\n                       ELSE 'question'\n                   END)\n               WHERE model = 'Card' AND JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) IS NOT NULL;;"]}}] ["with model" {:toucan2.pipeline/model nil}] ["resolve connection" {:toucan2.connection/connectable org.mariadb.jdbc.MariaDbConnection}] ["resolve connection" {:toucan2.connection/connectable nil}]]} {}
        at metabase.cmd.copy$do_step$fn__102149.invoke(copy.clj:33)
        at metabase.cmd.copy$do_step.invokeStatic(copy.clj:29)
        at metabase.cmd.copy$do_step.invoke(copy.clj:27)
        at metabase.cmd.copy$fn__102339$copy_BANG___102344$fn__102345.invoke(copy.clj:387)
        at metabase.cmd.copy$fn__102339$copy_BANG___102344.invoke(copy.clj:372)
        at metabase.cmd.load_from_h2$load_from_h2_BANG_.invokeStatic(load_from_h2.clj:36)
        at metabase.cmd.load_from_h2$load_from_h2_BANG_.invoke(load_from_h2.clj:26)
        at clojure.lang.Var.invoke(Var.java:384)
        at metabase.cmd$load_from_h2.invokeStatic(cmd.clj:74)
        at metabase.cmd$load_from_h2.invoke(cmd.clj:68)
        at clojure.lang.AFn.applyToHelper(AFn.java:154)
        at clojure.lang.AFn.applyTo(AFn.java:144)
        at clojure.core$apply.invokeStatic(core.clj:667)
        at clojure.core$apply.invoke(core.clj:662)
        at metabase.cmd$run_cmd$fn__103241.invoke(cmd.clj:301)
        at metabase.cmd$run_cmd.invokeStatic(cmd.clj:300)
        at metabase.cmd$run_cmd.invoke(cmd.clj:290)
        at clojure.lang.Var.invoke(Var.java:388)
        at metabase.core$run_cmd.invokeStatic(core.clj:178)
        at metabase.core$run_cmd.invoke(core.clj:176)
        at metabase.core$entrypoint.invokeStatic(core.clj:200)
        at metabase.core$entrypoint.doInvoke(core.clj:195)
        at clojure.lang.RestFn.applyTo(RestFn.java:137)
        at clojure.lang.Var.applyTo(Var.java:705)
        at clojure.core$apply.invokeStatic(core.clj:667)
        at clojure.core$apply.invoke(core.clj:662)
        at metabase.bootstrap$_main.invokeStatic(bootstrap.clj:31)
        at metabase.bootstrap$_main.doInvoke(bootstrap.clj:28)
        at clojure.lang.RestFn.applyTo(RestFn.java:137)
        at metabase.bootstrap.main(Unknown Source)
Caused by: liquibase.exception.CommandExecutionException: liquibase.exception.LiquibaseException: liquibase.exception.MigrationFailedException: Migration failed for changeset migrations/001_update_migrations.yaml::v49.2024-01-22T11:52:00::qnkhuat:
     Reason: clojure.lang.ExceptionInfo: (conn=79231) Illegal mix of collations (utf8mb3_general_ci,COERCIBLE) and (utf8mb3_unicode_ci,COERCIBLE) for operation '=' {:toucan2/context-trace [["execute SQL with class com.mchange.v2.c3p0.impl.NewProxyConnection" {:toucan2.jdbc.query/sql-args ["UPDATE revision\n               SET object = JSON_SET(\n                   object,\n                   '$.type',\n                   CASE\n                       WHEN JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) = 'true' THEN 'model'\n                       ELSE 'question'\n                   END)\n               WHERE model = 'Card' AND JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) IS NOT NULL;;"]}] ["resolve connection" {:toucan2.connection/connectable org.mariadb.jdbc.MariaDbConnection}] ["resolve connection" {:toucan2.connection/connectable nil}] {:toucan2.pipeline/rf #object[clojure.core$map$fn__5931$fn__5932 0x75b34b86 "clojure.core$map$fn__5931$fn__5932@75b34b86"]} ["with compiled query" {:toucan2.pipeline/compiled-query ["UPDATE revision\n               SET object = JSON_SET(\n                   object,\n                   '$.type',\n                   CASE\n                       WHEN JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) = 'true' THEN 'model'\n                       ELSE 'question'\n                   END)\n               WHERE model = 'Card' AND JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) IS NOT NULL;;"]}] ["with built query" {:toucan2.pipeline/built-query ["UPDATE revision\n               SET object = JSON_SET(\n                   object,\n                   '$.type',\n                   CASE\n                       WHEN JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) = 'true' THEN 'model'\n                       ELSE 'question'\n                   END)\n               WHERE model = 'Card' AND JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) IS NOT NULL;;"]}] ["with resolved query" {:toucan2.pipeline/resolved-query ["UPDATE revision\n               SET object = JSON_SET(\n                   object,\n                   '$.type',\n                   CASE\n                       WHEN JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) = 'true' THEN 'model'\n                       ELSE 'question'\n                   END)\n               WHERE model = 'Card' AND JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) IS NOT NULL;;"]}] ["with parsed args" {:toucan2.pipeline/query-type :toucan.result-type/*, :toucan2.pipeline/parsed-args {:connectable nil, :queryable ["UPDATE revision\n               SET object = JSON_SET(\n                   object,\n                   '$.type',\n                   CASE\n                       WHEN JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) = 'true' THEN 'model'\n                       ELSE 'question'\n                   END)\n               WHERE model = 'Card' AND JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) IS NOT NULL;;"]}}] ["with model" {:toucan2.pipeline/model nil}] ["resolve connection" {:toucan2.connection/connectable org.mariadb.jdbc.MariaDbConnection}] ["resolve connection" {:toucan2.connection/connectable nil}]]}
        at liquibase.command.CommandScope.execute(CommandScope.java:253)
        at liquibase.Liquibase.lambda$update$0(Liquibase.java:245)
        at liquibase.Scope.lambda$child$0(Scope.java:186)
        at liquibase.Scope.child(Scope.java:195)
        at liquibase.Scope.child(Scope.java:185)
        at liquibase.Scope.child(Scope.java:164)
        at liquibase.Liquibase.runInScope(Liquibase.java:1419)
        at liquibase.Liquibase.update(Liquibase.java:234)
        at liquibase.Liquibase.update(Liquibase.java:212)
        at liquibase.Liquibase.update(Liquibase.java:194)
        at metabase.db.liquibase$migrate_up_if_needed_BANG_.invokeStatic(liquibase.clj:240)
        at metabase.db.liquibase$migrate_up_if_needed_BANG_.invoke(liquibase.clj:222)
        at metabase.db.setup$migrate_BANG_$fn__50987.invoke(setup.clj:80)
        at metabase.db.liquibase$do_with_liquibase$f_STAR___48693.invoke(liquibase.clj:135)
        at metabase.db.liquibase$do_with_liquibase.invokeStatic(liquibase.clj:138)
        at metabase.db.liquibase$do_with_liquibase.invoke(liquibase.clj:126)
        at metabase.db.setup$migrate_BANG_.invokeStatic(setup.clj:75)
        at metabase.db.setup$migrate_BANG_.doInvoke(setup.clj:56)
        at clojure.lang.RestFn.invoke(RestFn.java:445)
        at metabase.db.setup$run_schema_migrations_BANG_.invokeStatic(setup.clj:147)
        at metabase.db.setup$run_schema_migrations_BANG_.invoke(setup.clj:141)
        at metabase.db.setup$setup_db_BANG_$fn__51015$fn__51016.invoke(setup.clj:165)
        at metabase.util.jvm$do_with_us_locale.invokeStatic(jvm.clj:239)
        at metabase.util.jvm$do_with_us_locale.invoke(jvm.clj:225)
        at metabase.db.setup$setup_db_BANG_$fn__51015.invoke(setup.clj:160)
        at metabase.db.setup$setup_db_BANG_.invokeStatic(setup.clj:159)
        at metabase.db.setup$setup_db_BANG_.invoke(setup.clj:153)
        at metabase.cmd.copy$fn__102339$copy_BANG___102344$fn__102345$fn__102352.invoke(copy.clj:388)
        at metabase.cmd.copy$do_step$fn__102149.invoke(copy.clj:30)
        ... 29 more
Caused by: liquibase.exception.LiquibaseException: liquibase.exception.MigrationFailedException: Migration failed for changeset migrations/001_update_migrations.yaml::v49.2024-01-22T11:52:00::qnkhuat:
     Reason: clojure.lang.ExceptionInfo: (conn=79231) Illegal mix of collations (utf8mb3_general_ci,COERCIBLE) and (utf8mb3_unicode_ci,COERCIBLE) for operation '=' {:toucan2/context-trace [["execute SQL with class com.mchange.v2.c3p0.impl.NewProxyConnection" {:toucan2.jdbc.query/sql-args ["UPDATE revision\n               SET object = JSON_SET(\n                   object,\n                   '$.type',\n                   CASE\n                       WHEN JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) = 'true' THEN 'model'\n                       ELSE 'question'\n                   END)\n               WHERE model = 'Card' AND JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) IS NOT NULL;;"]}] ["resolve connection" {:toucan2.connection/connectable org.mariadb.jdbc.MariaDbConnection}] ["resolve connection" {:toucan2.connection/connectable nil}] {:toucan2.pipeline/rf #object[clojure.core$map$fn__5931$fn__5932 0x75b34b86 "clojure.core$map$fn__5931$fn__5932@75b34b86"]} ["with compiled query" {:toucan2.pipeline/compiled-query ["UPDATE revision\n               SET object = JSON_SET(\n                   object,\n                   '$.type',\n                   CASE\n                       WHEN JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) = 'true' THEN 'model'\n                       ELSE 'question'\n                   END)\n               WHERE model = 'Card' AND JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) IS NOT NULL;;"]}] ["with built query" {:toucan2.pipeline/built-query ["UPDATE revision\n               SET object = JSON_SET(\n                   object,\n                   '$.type',\n                   CASE\n                       WHEN JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) = 'true' THEN 'model'\n                       ELSE 'question'\n                   END)\n               WHERE model = 'Card' AND JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) IS NOT NULL;;"]}] ["with resolved query" {:toucan2.pipeline/resolved-query ["UPDATE revision\n               SET object = JSON_SET(\n                   object,\n                   '$.type',\n                   CASE\n                       WHEN JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) = 'true' THEN 'model'\n                       ELSE 'question'\n                   END)\n               WHERE model = 'Card' AND JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) IS NOT NULL;;"]}] ["with parsed args" {:toucan2.pipeline/query-type :toucan.result-type/*, :toucan2.pipeline/parsed-args {:connectable nil, :queryable ["UPDATE revision\n               SET object = JSON_SET(\n                   object,\n                   '$.type',\n                   CASE\n                       WHEN JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) = 'true' THEN 'model'\n                       ELSE 'question'\n                   END)\n               WHERE model = 'Card' AND JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) IS NOT NULL;;"]}}] ["with model" {:toucan2.pipeline/model nil}] ["resolve connection" {:toucan2.connection/connectable org.mariadb.jdbc.MariaDbConnection}] ["resolve connection" {:toucan2.connection/connectable nil}]]}
        at liquibase.changelog.ChangeLogIterator.run(ChangeLogIterator.java:151)
        at liquibase.command.core.AbstractUpdateCommandStep.lambda$run$0(AbstractUpdateCommandStep.java:110)
        at liquibase.Scope.lambda$child$0(Scope.java:186)
        at liquibase.Scope.child(Scope.java:195)
        at liquibase.Scope.child(Scope.java:185)
        at liquibase.Scope.child(Scope.java:164)
        at liquibase.command.core.AbstractUpdateCommandStep.run(AbstractUpdateCommandStep.java:108)
        at liquibase.command.core.UpdateCommandStep.run(UpdateCommandStep.java:105)
        at liquibase.command.CommandScope.execute(CommandScope.java:217)
        ... 57 more
Caused by: liquibase.exception.MigrationFailedException: Migration failed for changeset migrations/001_update_migrations.yaml::v49.2024-01-22T11:52:00::qnkhuat:
     Reason: clojure.lang.ExceptionInfo: (conn=79231) Illegal mix of collations (utf8mb3_general_ci,COERCIBLE) and (utf8mb3_unicode_ci,COERCIBLE) for operation '=' {:toucan2/context-trace [["execute SQL with class com.mchange.v2.c3p0.impl.NewProxyConnection" {:toucan2.jdbc.query/sql-args ["UPDATE revision\n               SET object = JSON_SET(\n                   object,\n                   '$.type',\n                   CASE\n                       WHEN JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) = 'true' THEN 'model'\n                       ELSE 'question'\n                   END)\n               WHERE model = 'Card' AND JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) IS NOT NULL;;"]}] ["resolve connection" {:toucan2.connection/connectable org.mariadb.jdbc.MariaDbConnection}] ["resolve connection" {:toucan2.connection/connectable nil}] {:toucan2.pipeline/rf #object[clojure.core$map$fn__5931$fn__5932 0x75b34b86 "clojure.core$map$fn__5931$fn__5932@75b34b86"]} ["with compiled query" {:toucan2.pipeline/compiled-query ["UPDATE revision\n               SET object = JSON_SET(\n                   object,\n                   '$.type',\n                   CASE\n                       WHEN JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) = 'true' THEN 'model'\n                       ELSE 'question'\n                   END)\n               WHERE model = 'Card' AND JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) IS NOT NULL;;"]}] ["with built query" {:toucan2.pipeline/built-query ["UPDATE revision\n               SET object = JSON_SET(\n                   object,\n                   '$.type',\n                   CASE\n                       WHEN JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) = 'true' THEN 'model'\n                       ELSE 'question'\n                   END)\n               WHERE model = 'Card' AND JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) IS NOT NULL;;"]}] ["with resolved query" {:toucan2.pipeline/resolved-query ["UPDATE revision\n               SET object = JSON_SET(\n                   object,\n                   '$.type',\n                   CASE\n                       WHEN JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) = 'true' THEN 'model'\n                       ELSE 'question'\n                   END)\n               WHERE model = 'Card' AND JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) IS NOT NULL;;"]}] ["with parsed args" {:toucan2.pipeline/query-type :toucan.result-type/*, :toucan2.pipeline/parsed-args {:connectable nil, :queryable ["UPDATE revision\n               SET object = JSON_SET(\n                   object,\n                   '$.type',\n                   CASE\n                       WHEN JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) = 'true' THEN 'model'\n                       ELSE 'question'\n                   END)\n               WHERE model = 'Card' AND JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) IS NOT NULL;;"]}}] ["with model" {:toucan2.pipeline/model nil}] ["resolve connection" {:toucan2.connection/connectable org.mariadb.jdbc.MariaDbConnection}] ["resolve connection" {:toucan2.connection/connectable nil}]]}
        at liquibase.changelog.ChangeSet.execute(ChangeSet.java:797)
        at liquibase.changelog.visitor.UpdateVisitor.executeAcceptedChange(UpdateVisitor.java:119)
        at liquibase.changelog.visitor.UpdateVisitor.visit(UpdateVisitor.java:68)
        at liquibase.changelog.ChangeLogIterator$2.lambda$run$0(ChangeLogIterator.java:133)
        at liquibase.Scope.lambda$child$0(Scope.java:186)
        at liquibase.Scope.child(Scope.java:195)
        at liquibase.Scope.child(Scope.java:185)
        at liquibase.Scope.child(Scope.java:164)
        at liquibase.changelog.ChangeLogIterator$2.run(ChangeLogIterator.java:122)
        at liquibase.Scope.lambda$child$0(Scope.java:186)
        at liquibase.Scope.child(Scope.java:195)
        at liquibase.Scope.child(Scope.java:185)
        at liquibase.Scope.child(Scope.java:164)
        at liquibase.Scope.child(Scope.java:252)
        at liquibase.Scope.child(Scope.java:256)
        at liquibase.changelog.ChangeLogIterator.run(ChangeLogIterator.java:89)
        ... 65 more
Caused by: clojure.lang.ExceptionInfo: (conn=79231) Illegal mix of collations (utf8mb3_general_ci,COERCIBLE) and (utf8mb3_unicode_ci,COERCIBLE) for operation '=' {:toucan2/context-trace [["execute SQL with class com.mchange.v2.c3p0.impl.NewProxyConnection" {:toucan2.jdbc.query/sql-args ["UPDATE revision\n               SET object = JSON_SET(\n                   object,\n                   '$.type',\n                   CASE\n                       WHEN JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) = 'true' THEN 'model'\n                       ELSE 'question'\n                   END)\n               WHERE model = 'Card' AND JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) IS NOT NULL;;"]}] ["resolve connection" {:toucan2.connection/connectable org.mariadb.jdbc.MariaDbConnection}] ["resolve connection" {:toucan2.connection/connectable nil}] {:toucan2.pipeline/rf #object[clojure.core$map$fn__5931$fn__5932 0x75b34b86 "clojure.core$map$fn__5931$fn__5932@75b34b86"]} ["with compiled query" {:toucan2.pipeline/compiled-query ["UPDATE revision\n               SET object = JSON_SET(\n                   object,\n                   '$.type',\n                   CASE\n                       WHEN JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) = 'true' THEN 'model'\n                       ELSE 'question'\n                   END)\n               WHERE model = 'Card' AND JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) IS NOT NULL;;"]}] ["with built query" {:toucan2.pipeline/built-query ["UPDATE revision\n               SET object = JSON_SET(\n                   object,\n                   '$.type',\n                   CASE\n                       WHEN JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) = 'true' THEN 'model'\n                       ELSE 'question'\n                   END)\n               WHERE model = 'Card' AND JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) IS NOT NULL;;"]}] ["with resolved query" {:toucan2.pipeline/resolved-query ["UPDATE revision\n               SET object = JSON_SET(\n                   object,\n                   '$.type',\n                   CASE\n                       WHEN JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) = 'true' THEN 'model'\n                       ELSE 'question'\n                   END)\n               WHERE model = 'Card' AND JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) IS NOT NULL;;"]}] ["with parsed args" {:toucan2.pipeline/query-type :toucan.result-type/*, :toucan2.pipeline/parsed-args {:connectable nil, :queryable ["UPDATE revision\n               SET object = JSON_SET(\n                   object,\n                   '$.type',\n                   CASE\n                       WHEN JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) = 'true' THEN 'model'\n                       ELSE 'question'\n                   END)\n               WHERE model = 'Card' AND JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) IS NOT NULL;;"]}}] ["with model" {:toucan2.pipeline/model nil}] ["resolve connection" {:toucan2.connection/connectable org.mariadb.jdbc.MariaDbConnection}] ["resolve connection" {:toucan2.connection/connectable nil}]]}
        at org.mariadb.jdbc.internal.util.exceptions.ExceptionFactory.createException(ExceptionFactory.java:79)
        at org.mariadb.jdbc.internal.util.exceptions.ExceptionFactory.create(ExceptionFactory.java:158)
        at org.mariadb.jdbc.MariaDbStatement.executeExceptionEpilogue(MariaDbStatement.java:262)
        at org.mariadb.jdbc.ClientSidePreparedStatement.executeInternal(ClientSidePreparedStatement.java:229)
        at org.mariadb.jdbc.ClientSidePreparedStatement.execute(ClientSidePreparedStatement.java:149)
        at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.execute(NewProxyPreparedStatement.java:67)
        at toucan2.jdbc.query$reduce_jdbc_query.invokeStatic(query.clj:40)
        at toucan2.jdbc.query$reduce_jdbc_query.invoke(query.clj:22)
        at toucan2.jdbc.pipeline$transduce_execute_with_connection_primary_method_java_sql_Connection_default_default.invokeStatic(pipeline.clj:19)
        at toucan2.jdbc.pipeline$transduce_execute_with_connection_primary_method_java_sql_Connection_default_default.invoke(pipeline.clj:9)
        at clojure.lang.AFn.applyToHelper(AFn.java:178)
        at clojure.lang.AFn.applyTo(AFn.java:144)
        at clojure.lang.AFunction$1.doInvoke(AFunction.java:31)
        at clojure.lang.RestFn.applyTo(RestFn.java:137)
        at clojure.core$apply.invokeStatic(core.clj:675)
        at clojure.core$partial$fn__5908.doInvoke(core.clj:2639)
        at clojure.lang.RestFn.applyTo(RestFn.java:146)
        at clojure.lang.AFunction$1.doInvoke(AFunction.java:31)
        at clojure.lang.RestFn.applyTo(RestFn.java:137)
        at clojure.core$apply.invokeStatic(core.clj:667)
        at clojure.core$apply.invoke(core.clj:662)
        at methodical.impl.combo.threaded$fn__18227$fn__18228$fn__18235.invoke(threaded.clj:79)
        at methodical.impl.combo.threaded$reducer_fn$fn__18197$fn__18201.invoke(threaded.clj:23)
        at clojure.lang.ArrayChunk.reduce(ArrayChunk.java:58)
        at clojure.core.protocols$fn__8244.invokeStatic(protocols.clj:136)
        at clojure.core.protocols$fn__8244.invoke(protocols.clj:124)
        at clojure.core.protocols$fn__8204$G__8199__8213.invoke(protocols.clj:19)
        at clojure.core.protocols$seq_reduce.invokeStatic(protocols.clj:31)
        at clojure.core.protocols$fn__8236.invokeStatic(protocols.clj:75)
        at clojure.core.protocols$fn__8236.invoke(protocols.clj:75)
        at clojure.core.protocols$fn__8178$G__8173__8191.invoke(protocols.clj:13)
        at clojure.core$reduce.invokeStatic(core.clj:6887)
        at clojure.core$reduce.invoke(core.clj:6869)
        at methodical.impl.combo.threaded$reducer_fn$fn__18197.invoke(threaded.clj:21)
        at clojure.core$comp$fn__5876.doInvoke(core.clj:2589)
        at clojure.lang.RestFn.applyTo(RestFn.java:146)
        at clojure.core$apply.invokeStatic(core.clj:675)
        at clojure.core$apply.doInvoke(core.clj:662)
        at clojure.lang.RestFn.invoke(RestFn.java:533)
        at methodical.impl.combo.threaded$combine_with_threader$fn__18207.doInvoke(threaded.clj:46)
        at clojure.lang.RestFn.applyTo(RestFn.java:151)
        at clojure.lang.AFunction$1.doInvoke(AFunction.java:31)
        at clojure.lang.RestFn.applyTo(RestFn.java:137)
        at clojure.core$apply.invokeStatic(core.clj:675)
        at clojure.core$apply.doInvoke(core.clj:662)
        at clojure.lang.RestFn.invoke(RestFn.java:533)
        at methodical.impl.standard$invoke_multifn.invokeStatic(standard.clj:65)
        at methodical.impl.standard$invoke_multifn.doInvoke(standard.clj:47)
        at clojure.lang.RestFn.invoke(RestFn.java:594)
        at methodical.impl.standard.StandardMultiFn.invoke(standard.clj:199)
        at toucan2.pipeline$transduce_execute$with_connection_STAR___21460.invoke(pipeline.clj:78)
        at toucan2.connection$bind_current_connectable_fn$fn__21137.invoke(connection.clj:104)
        at toucan2.connection$bind_current_connectable_fn$fn__21137.invoke(connection.clj:104)
        at toucan2.jdbc.connection$do_with_connection_primary_method_java_sql_Connection.invokeStatic(connection.clj:13)
        at toucan2.jdbc.connection$do_with_connection_primary_method_java_sql_Connection.invoke(connection.clj:11)
        at clojure.lang.AFn.applyToHelper(AFn.java:160)
        at clojure.lang.AFn.applyTo(AFn.java:144)
        at clojure.lang.AFunction$1.doInvoke(AFunction.java:31)
        at clojure.lang.RestFn.invoke(RestFn.java:436)
        at clojure.core$partial$fn__5908.invoke(core.clj:2642)
        at clojure.lang.AFn.applyToHelper(AFn.java:156)
        at clojure.lang.RestFn.applyTo(RestFn.java:132)
        at clojure.lang.AFunction$1.doInvoke(AFunction.java:31)
        at clojure.lang.RestFn.invoke(RestFn.java:421)
        at methodical.impl.combo.threaded$fn__18227$fn__18228$fn__18229.invoke(threaded.clj:70)
        at methodical.impl.combo.threaded$reducer_fn$fn__18197$fn__18201.invoke(threaded.clj:23)
        at clojure.lang.ArrayChunk.reduce(ArrayChunk.java:58)
        at clojure.core.protocols$fn__8244.invokeStatic(protocols.clj:136)
        at clojure.core.protocols$fn__8244.invoke(protocols.clj:124)
        at clojure.core.protocols$fn__8204$G__8199__8213.invoke(protocols.clj:19)
        at clojure.core.protocols$seq_reduce.invokeStatic(protocols.clj:31)
        at clojure.core.protocols$fn__8236.invokeStatic(protocols.clj:75)
        at clojure.core.protocols$fn__8236.invoke(protocols.clj:75)
        at clojure.core.protocols$fn__8178$G__8173__8191.invoke(protocols.clj:13)
        at clojure.core$reduce.invokeStatic(core.clj:6887)
        at clojure.core$reduce.invoke(core.clj:6869)
        at methodical.impl.combo.threaded$reducer_fn$fn__18197.invoke(threaded.clj:21)
        at clojure.core$comp$fn__5876.invoke(core.clj:2587)
        at methodical.impl.combo.threaded$combine_with_threader$fn__18207.invoke(threaded.clj:43)
        at clojure.lang.AFn.applyToHelper(AFn.java:156)
        at clojure.lang.RestFn.applyTo(RestFn.java:132)
        at clojure.lang.AFunction$1.doInvoke(AFunction.java:31)
        at clojure.lang.RestFn.invoke(RestFn.java:421)
        at toucan2.connection$do_with_connection_around_method_toucan2_connection_default.invokeStatic(connection.clj:118)
        at toucan2.connection$do_with_connection_around_method_toucan2_connection_default.invoke(connection.clj:106)
        at clojure.lang.AFn.applyToHelper(AFn.java:160)
        at clojure.lang.AFn.applyTo(AFn.java:144)
        at clojure.lang.AFunction$1.doInvoke(AFunction.java:31)
        at clojure.lang.RestFn.invoke(RestFn.java:436)
        at clojure.core$partial$fn__5908.invoke(core.clj:2642)
        at clojure.lang.AFn.applyToHelper(AFn.java:156)
        at clojure.lang.RestFn.applyTo(RestFn.java:132)
        at clojure.lang.AFunction$1.doInvoke(AFunction.java:31)
        at clojure.lang.RestFn.invoke(RestFn.java:421)
        at methodical.impl.standard$invoke_multifn.invokeStatic(standard.clj:55)
        at methodical.impl.standard$invoke_multifn.invoke(standard.clj:47)
        at methodical.impl.standard.StandardMultiFn.invoke(standard.clj:193)
        at toucan2.connection$do_with_connection_primary_method_.invokeStatic(connection.clj:204)
        at toucan2.connection$do_with_connection_primary_method_.invoke(connection.clj:194)
        at clojure.lang.AFn.applyToHelper(AFn.java:160)
        at clojure.lang.AFn.applyTo(AFn.java:144)
        at clojure.lang.AFunction$1.doInvoke(AFunction.java:31)
        at clojure.lang.RestFn.invoke(RestFn.java:436)
        at clojure.core$partial$fn__5908.invoke(core.clj:2642)
        at clojure.lang.AFn.applyToHelper(AFn.java:156)
        at clojure.lang.RestFn.applyTo(RestFn.java:132)
        at clojure.lang.AFunction$1.doInvoke(AFunction.java:31)
        at clojure.lang.RestFn.invoke(RestFn.java:421)
        at methodical.impl.combo.threaded$fn__18227$fn__18228$fn__18229.invoke(threaded.clj:70)
        at methodical.impl.combo.threaded$reducer_fn$fn__18197$fn__18201.invoke(threaded.clj:23)
        at clojure.lang.ArrayChunk.reduce(ArrayChunk.java:58)
        at clojure.core.protocols$fn__8244.invokeStatic(protocols.clj:136)
        at clojure.core.protocols$fn__8244.invoke(protocols.clj:124)
        at clojure.core.protocols$fn__8204$G__8199__8213.invoke(protocols.clj:19)
        at clojure.core.protocols$seq_reduce.invokeStatic(protocols.clj:31)
        at clojure.core.protocols$fn__8236.invokeStatic(protocols.clj:75)
        at clojure.core.protocols$fn__8236.invoke(protocols.clj:75)
        at clojure.core.protocols$fn__8178$G__8173__8191.invoke(protocols.clj:13)
        at clojure.core$reduce.invokeStatic(core.clj:6887)
        at clojure.core$reduce.invoke(core.clj:6869)
        at methodical.impl.combo.threaded$reducer_fn$fn__18197.invoke(threaded.clj:21)
        at clojure.core$comp$fn__5876.invoke(core.clj:2587)
        at methodical.impl.combo.threaded$combine_with_threader$fn__18207.invoke(threaded.clj:43)
        at clojure.lang.AFn.applyToHelper(AFn.java:156)
        at clojure.lang.RestFn.applyTo(RestFn.java:132)
        at clojure.lang.AFunction$1.doInvoke(AFunction.java:31)
        at clojure.lang.RestFn.invoke(RestFn.java:421)
        at toucan2.connection$do_with_connection_around_method_toucan2_connection_default.invokeStatic(connection.clj:118)
        at toucan2.connection$do_with_connection_around_method_toucan2_connection_default.invoke(connection.clj:106)
        at clojure.lang.AFn.applyToHelper(AFn.java:160)
        at clojure.lang.AFn.applyTo(AFn.java:144)
        at clojure.lang.AFunction$1.doInvoke(AFunction.java:31)
        at clojure.lang.RestFn.invoke(RestFn.java:436)
        at clojure.core$partial$fn__5908.invoke(core.clj:2642)
        at clojure.lang.AFn.applyToHelper(AFn.java:156)
        at clojure.lang.RestFn.applyTo(RestFn.java:132)
        at clojure.lang.AFunction$1.doInvoke(AFunction.java:31)
        at clojure.lang.RestFn.invoke(RestFn.java:421)
        at methodical.impl.standard$invoke_multifn.invokeStatic(standard.clj:55)
        at methodical.impl.standard$invoke_multifn.invoke(standard.clj:47)
        at methodical.impl.standard.StandardMultiFn.invoke(standard.clj:193)
        at toucan2.pipeline$transduce_execute.invokeStatic(pipeline.clj:77)
        at toucan2.pipeline$transduce_execute.invoke(pipeline.clj:64)
        at clojure.lang.Var.invoke(Var.java:399)
        at toucan2.pipeline$transduce_compiled_query.invokeStatic(pipeline.clj:244)
        at toucan2.pipeline$transduce_compiled_query.invoke(pipeline.clj:240)
        at toucan2.pipeline$transduce_built_query.invokeStatic(pipeline.clj:252)
        at toucan2.pipeline$transduce_built_query.invoke(pipeline.clj:246)
        at toucan2.pipeline$transduce_query_primary_method_default.invokeStatic(pipeline.clj:272)
        at toucan2.pipeline$transduce_query_primary_method_default.invoke(pipeline.clj:269)
        at clojure.lang.AFn.applyToHelper(AFn.java:178)
        at clojure.lang.AFn.applyTo(AFn.java:144)
        at clojure.lang.AFunction$1.doInvoke(AFunction.java:31)
        at clojure.lang.RestFn.applyTo(RestFn.java:137)
        at clojure.core$apply.invokeStatic(core.clj:675)
        at clojure.core$partial$fn__5908.doInvoke(core.clj:2639)
        at clojure.lang.RestFn.applyTo(RestFn.java:146)
        at clojure.lang.AFunction$1.doInvoke(AFunction.java:31)
        at clojure.lang.RestFn.applyTo(RestFn.java:137)
        at clojure.core$apply.invokeStatic(core.clj:667)
        at clojure.core$apply.invoke(core.clj:662)
        at methodical.impl.combo.threaded$fn__18227$fn__18228$fn__18235.invoke(threaded.clj:79)
        at methodical.impl.combo.threaded$reducer_fn$fn__18197$fn__18201.invoke(threaded.clj:23)
        at clojure.lang.ArrayChunk.reduce(ArrayChunk.java:58)
        at clojure.core.protocols$fn__8244.invokeStatic(protocols.clj:136)
        at clojure.core.protocols$fn__8244.invoke(protocols.clj:124)
        at clojure.core.protocols$fn__8204$G__8199__8213.invoke(protocols.clj:19)
        at clojure.core.protocols$seq_reduce.invokeStatic(protocols.clj:31)
        at clojure.core.protocols$fn__8236.invokeStatic(protocols.clj:75)
        at clojure.core.protocols$fn__8236.invoke(protocols.clj:75)
        at clojure.core.protocols$fn__8178$G__8173__8191.invoke(protocols.clj:13)
        at clojure.core$reduce.invokeStatic(core.clj:6887)
        at clojure.core$reduce.invoke(core.clj:6869)
        at methodical.impl.combo.threaded$reducer_fn$fn__18197.invoke(threaded.clj:21)
        at clojure.core$comp$fn__5876.doInvoke(core.clj:2589)
        at clojure.lang.RestFn.applyTo(RestFn.java:146)
        at clojure.core$apply.invokeStatic(core.clj:675)
        at clojure.core$apply.doInvoke(core.clj:662)
        at clojure.lang.RestFn.invoke(RestFn.java:533)
        at methodical.impl.combo.threaded$combine_with_threader$fn__18207.doInvoke(threaded.clj:46)
        at clojure.lang.RestFn.applyTo(RestFn.java:151)
        at clojure.lang.AFunction$1.doInvoke(AFunction.java:31)
        at clojure.lang.RestFn.applyTo(RestFn.java:137)
        at clojure.core$apply.invokeStatic(core.clj:675)
        at clojure.core$apply.doInvoke(core.clj:662)
        at clojure.lang.RestFn.invoke(RestFn.java:533)
        at methodical.impl.standard$invoke_multifn.invokeStatic(standard.clj:65)
        at methodical.impl.standard$invoke_multifn.doInvoke(standard.clj:47)
        at clojure.lang.RestFn.invoke(RestFn.java:594)
        at methodical.impl.standard.StandardMultiFn.invoke(standard.clj:199)
        at toucan2.pipeline$transduce_query_STAR_.invokeStatic(pipeline.clj:278)
        at toucan2.pipeline$transduce_query_STAR_.invoke(pipeline.clj:274)
        at toucan2.pipeline$transduce_with_model.invokeStatic(pipeline.clj:293)
        at toucan2.pipeline$transduce_with_model.invoke(pipeline.clj:280)
        at toucan2.pipeline$transduce_parsed.invokeStatic(pipeline.clj:309)
        at toucan2.pipeline$transduce_parsed.invoke(pipeline.clj:295)
        at toucan2.execute$fn__21576.invokeStatic(execute.clj:79)
        at toucan2.execute$fn__21576.invoke(execute.clj:77)
        at toucan2.execute$query_STAR_$query_STAR__STAR___21573.invoke(execute.clj:39)
        at toucan2.execute$query_STAR_$query_STAR__STAR___21573.invoke(execute.clj:33)
        at toucan2.execute$query_STAR_$query_STAR__STAR___21573.invoke(execute.clj:28)
        at toucan2.execute$query_STAR_$query_STAR__STAR___21573.invoke(execute.clj:25)
        at metabase.db.custom_migrations.CardRevisionAddType$with_connection_STAR___48509$with_transaction_STAR___48510.invoke(custom_migrations.clj:1050)
        at toucan2.connection$bind_current_connectable_fn$fn__21137.invoke(connection.clj:104)
        at metabase.db.connection$do_transaction$thunk__32312.invoke(connection.clj:150)
        at metabase.db.connection$do_transaction.invokeStatic(connection.clj:165)
        at metabase.db.connection$do_transaction.invoke(connection.clj:146)
        at metabase.db.connection$do_with_transaction_primary_method_java_sql_Connection.invokeStatic(connection.clj:199)
        at metabase.db.connection$do_with_transaction_primary_method_java_sql_Connection.invoke(connection.clj:172)
        at clojure.lang.AFn.applyToHelper(AFn.java:165)
        at clojure.lang.AFn.applyTo(AFn.java:144)
        at clojure.lang.AFunction$1.doInvoke(AFunction.java:31)
        at clojure.lang.RestFn.invoke(RestFn.java:457)
        at clojure.core$partial$fn__5908.invoke(core.clj:2643)
        at clojure.lang.AFn.applyToHelper(AFn.java:160)
        at clojure.lang.RestFn.applyTo(RestFn.java:132)
        at clojure.lang.AFunction$1.doInvoke(AFunction.java:31)
        at clojure.lang.RestFn.invoke(RestFn.java:436)
        at methodical.impl.combo.threaded$fn__18227$fn__18228$fn__18231.invoke(threaded.clj:71)
        at methodical.impl.combo.threaded$reducer_fn$fn__18197$fn__18201.invoke(threaded.clj:23)
        at clojure.lang.ArrayChunk.reduce(ArrayChunk.java:58)
        at clojure.core.protocols$fn__8244.invokeStatic(protocols.clj:136)
        at clojure.core.protocols$fn__8244.invoke(protocols.clj:124)
        at clojure.core.protocols$fn__8204$G__8199__8213.invoke(protocols.clj:19)
        at clojure.core.protocols$seq_reduce.invokeStatic(protocols.clj:31)
        at clojure.core.protocols$fn__8236.invokeStatic(protocols.clj:75)
        at clojure.core.protocols$fn__8236.invoke(protocols.clj:75)
        at clojure.core.protocols$fn__8178$G__8173__8191.invoke(protocols.clj:13)
        at clojure.core$reduce.invokeStatic(core.clj:6887)
        at clojure.core$reduce.invoke(core.clj:6869)
        at methodical.impl.combo.threaded$reducer_fn$fn__18197.invoke(threaded.clj:21)
        at clojure.core$comp$fn__5876.invoke(core.clj:2588)
        at methodical.impl.combo.threaded$combine_with_threader$fn__18207.invoke(threaded.clj:44)
        at clojure.lang.AFn.applyToHelper(AFn.java:160)
        at clojure.lang.RestFn.applyTo(RestFn.java:132)
        at clojure.lang.AFunction$1.doInvoke(AFunction.java:31)
        at clojure.lang.RestFn.invoke(RestFn.java:436)
        at toucan2.connection$do_with_transaction_around_method_toucan2_connection_default.invokeStatic(connection.clj:249)
        at toucan2.connection$do_with_transaction_around_method_toucan2_connection_default.invoke(connection.clj:245)
        at clojure.lang.AFn.applyToHelper(AFn.java:165)
        at clojure.lang.AFn.applyTo(AFn.java:144)
        at clojure.lang.AFunction$1.doInvoke(AFunction.java:31)
        at clojure.lang.RestFn.invoke(RestFn.java:457)
        at clojure.core$partial$fn__5908.invoke(core.clj:2643)
        at clojure.lang.AFn.applyToHelper(AFn.java:160)
        at clojure.lang.RestFn.applyTo(RestFn.java:132)
        at clojure.lang.AFunction$1.doInvoke(AFunction.java:31)
        at clojure.lang.RestFn.invoke(RestFn.java:436)
        at methodical.impl.standard$invoke_multifn.invokeStatic(standard.clj:58)
        at methodical.impl.standard$invoke_multifn.invoke(standard.clj:47)
        at methodical.impl.standard.StandardMultiFn.invoke(standard.clj:195)
        at metabase.db.custom_migrations.CardRevisionAddType$with_connection_STAR___48509.invoke(custom_migrations.clj:1037)
        at toucan2.connection$bind_current_connectable_fn$fn__21137.invoke(connection.clj:104)
        at toucan2.connection$bind_current_connectable_fn$fn__21137.invoke(connection.clj:104)
        at toucan2.jdbc.connection$do_with_connection_primary_method_java_sql_Connection.invokeStatic(connection.clj:13)
        at toucan2.jdbc.connection$do_with_connection_primary_method_java_sql_Connection.invoke(connection.clj:11)
        at clojure.lang.AFn.applyToHelper(AFn.java:160)
        at clojure.lang.AFn.applyTo(AFn.java:144)
        at clojure.lang.AFunction$1.doInvoke(AFunction.java:31)
        at clojure.lang.RestFn.invoke(RestFn.java:436)
        at clojure.core$partial$fn__5908.invoke(core.clj:2642)
        at clojure.lang.AFn.applyToHelper(AFn.java:156)
        at clojure.lang.RestFn.applyTo(RestFn.java:132)
        at clojure.lang.AFunction$1.doInvoke(AFunction.java:31)
        at clojure.lang.RestFn.invoke(RestFn.java:421)
        at methodical.impl.combo.threaded$fn__18227$fn__18228$fn__18229.invoke(threaded.clj:70)
        at methodical.impl.combo.threaded$reducer_fn$fn__18197$fn__18201.invoke(threaded.clj:23)
        at clojure.lang.ArrayChunk.reduce(ArrayChunk.java:58)
        at clojure.core.protocols$fn__8244.invokeStatic(protocols.clj:136)
        at clojure.core.protocols$fn__8244.invoke(protocols.clj:124)
        at clojure.core.protocols$fn__8204$G__8199__8213.invoke(protocols.clj:19)
        at clojure.core.protocols$seq_reduce.invokeStatic(protocols.clj:31)
        at clojure.core.protocols$fn__8236.invokeStatic(protocols.clj:75)
        at clojure.core.protocols$fn__8236.invoke(protocols.clj:75)
        at clojure.core.protocols$fn__8178$G__8173__8191.invoke(protocols.clj:13)
        at clojure.core$reduce.invokeStatic(core.clj:6887)
        at clojure.core$reduce.invoke(core.clj:6869)
        at methodical.impl.combo.threaded$reducer_fn$fn__18197.invoke(threaded.clj:21)
        at clojure.core$comp$fn__5876.invoke(core.clj:2587)
        at methodical.impl.combo.threaded$combine_with_threader$fn__18207.invoke(threaded.clj:43)
        at clojure.lang.AFn.applyToHelper(AFn.java:156)
        at clojure.lang.RestFn.applyTo(RestFn.java:132)
        at clojure.lang.AFunction$1.doInvoke(AFunction.java:31)
        at clojure.lang.RestFn.invoke(RestFn.java:421)
        at toucan2.connection$do_with_connection_around_method_toucan2_connection_default.invokeStatic(connection.clj:118)
        at toucan2.connection$do_with_connection_around_method_toucan2_connection_default.invoke(connection.clj:106)
        at clojure.lang.AFn.applyToHelper(AFn.java:160)
        at clojure.lang.AFn.applyTo(AFn.java:144)
        at clojure.lang.AFunction$1.doInvoke(AFunction.java:31)
        at clojure.lang.RestFn.invoke(RestFn.java:436)
        at clojure.core$partial$fn__5908.invoke(core.clj:2642)
        at clojure.lang.AFn.applyToHelper(AFn.java:156)
        at clojure.lang.RestFn.applyTo(RestFn.java:132)
        at clojure.lang.AFunction$1.doInvoke(AFunction.java:31)
        at clojure.lang.RestFn.invoke(RestFn.java:421)
        at methodical.impl.standard$invoke_multifn.invokeStatic(standard.clj:55)
        at methodical.impl.standard$invoke_multifn.invoke(standard.clj:47)
        at methodical.impl.standard.StandardMultiFn.invoke(standard.clj:193)
        at toucan2.connection$do_with_connection_primary_method_.invokeStatic(connection.clj:204)
        at toucan2.connection$do_with_connection_primary_method_.invoke(connection.clj:194)
        at clojure.lang.AFn.applyToHelper(AFn.java:160)
        at clojure.lang.AFn.applyTo(AFn.java:144)
        at clojure.lang.AFunction$1.doInvoke(AFunction.java:31)
        at clojure.lang.RestFn.invoke(RestFn.java:436)
        at clojure.core$partial$fn__5908.invoke(core.clj:2642)
        at clojure.lang.AFn.applyToHelper(AFn.java:156)
        at clojure.lang.RestFn.applyTo(RestFn.java:132)
        at clojure.lang.AFunction$1.doInvoke(AFunction.java:31)
        at clojure.lang.RestFn.invoke(RestFn.java:421)
        at methodical.impl.combo.threaded$fn__18227$fn__18228$fn__18229.invoke(threaded.clj:70)
        at methodical.impl.combo.threaded$reducer_fn$fn__18197$fn__18201.invoke(threaded.clj:23)
        at clojure.lang.ArrayChunk.reduce(ArrayChunk.java:58)
        at clojure.core.protocols$fn__8244.invokeStatic(protocols.clj:136)
        at clojure.core.protocols$fn__8244.invoke(protocols.clj:124)
        at clojure.core.protocols$fn__8204$G__8199__8213.invoke(protocols.clj:19)
        at clojure.core.protocols$seq_reduce.invokeStatic(protocols.clj:31)
        at clojure.core.protocols$fn__8236.invokeStatic(protocols.clj:75)
        at clojure.core.protocols$fn__8236.invoke(protocols.clj:75)
        at clojure.core.protocols$fn__8178$G__8173__8191.invoke(protocols.clj:13)
        at clojure.core$reduce.invokeStatic(core.clj:6887)
        at clojure.core$reduce.invoke(core.clj:6869)
        at methodical.impl.combo.threaded$reducer_fn$fn__18197.invoke(threaded.clj:21)
        at clojure.core$comp$fn__5876.invoke(core.clj:2587)
        at methodical.impl.combo.threaded$combine_with_threader$fn__18207.invoke(threaded.clj:43)
        at clojure.lang.AFn.applyToHelper(AFn.java:156)
        at clojure.lang.RestFn.applyTo(RestFn.java:132)
        at clojure.lang.AFunction$1.doInvoke(AFunction.java:31)
        at clojure.lang.RestFn.invoke(RestFn.java:421)
        at toucan2.connection$do_with_connection_around_method_toucan2_connection_default.invokeStatic(connection.clj:118)
        at toucan2.connection$do_with_connection_around_method_toucan2_connection_default.invoke(connection.clj:106)
        at clojure.lang.AFn.applyToHelper(AFn.java:160)
        at clojure.lang.AFn.applyTo(AFn.java:144)
        at clojure.lang.AFunction$1.doInvoke(AFunction.java:31)
        at clojure.lang.RestFn.invoke(RestFn.java:436)
        at clojure.core$partial$fn__5908.invoke(core.clj:2642)
        at clojure.lang.AFn.applyToHelper(AFn.java:156)
        at clojure.lang.RestFn.applyTo(RestFn.java:132)
        at clojure.lang.AFunction$1.doInvoke(AFunction.java:31)
        at clojure.lang.RestFn.invoke(RestFn.java:421)
        at methodical.impl.standard$invoke_multifn.invokeStatic(standard.clj:55)
        at methodical.impl.standard$invoke_multifn.invoke(standard.clj:47)
        at methodical.impl.standard.StandardMultiFn.invoke(standard.clj:193)
        at metabase.db.custom_migrations.CardRevisionAddType.execute(custom_migrations.clj:1037)
        at liquibase.change.custom.CustomChangeWrapper.generateStatements(CustomChangeWrapper.java:169)
        at liquibase.database.AbstractJdbcDatabase.executeStatements(AbstractJdbcDatabase.java:1271)
        at liquibase.changelog.ChangeSet.execute(ChangeSet.java:755)
        ... 80 more
Caused by: java.sql.SQLTransientConnectionException: (conn=79231) Illegal mix of collations (utf8mb3_general_ci,COERCIBLE) and (utf8mb3_unicode_ci,COERCIBLE) for operation '='
        ... 426 more
Caused by: org.mariadb.jdbc.internal.util.exceptions.MariaDbSqlException: Illegal mix of collations (utf8mb3_general_ci,COERCIBLE) and (utf8mb3_unicode_ci,COERCIBLE) for operation '='
        at org.mariadb.jdbc.internal.util.exceptions.MariaDbSqlException.of(MariaDbSqlException.java:34)
        at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.exceptionWithQuery(AbstractQueryProtocol.java:195)
        at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.exceptionWithQuery(AbstractQueryProtocol.java:178)
        at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.executeQuery(AbstractQueryProtocol.java:322)
        at org.mariadb.jdbc.ClientSidePreparedStatement.executeInternal(ClientSidePreparedStatement.java:220)
        ... 422 more
Caused by: java.sql.SQLException: Illegal mix of collations (utf8mb3_general_ci,COERCIBLE) and (utf8mb3_unicode_ci,COERCIBLE) for operation '='
        at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.readErrorPacket(AbstractQueryProtocol.java:1693)
        at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.readPacket(AbstractQueryProtocol.java:1555)
        at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.getResult(AbstractQueryProtocol.java:1518)
        at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.executeQuery(AbstractQueryProtocol.java:319)
        ... 423 more
Command failed with exception: ERROR Set up mysql target database and run migrations...: liquibase.exception.LiquibaseException: liquibase.exception.MigrationFailedException: Migration failed for changeset migrations/001_update_migrations.yaml::v49.2024-01-22T11:52:00::qnkhuat:
     Reason: clojure.lang.ExceptionInfo: (conn=79231) Illegal mix of collations (utf8mb3_general_ci,COERCIBLE) and (utf8mb3_unicode_ci,COERCIBLE) for operation '=' {:toucan2/context-trace [["execute SQL with class com.mchange.v2.c3p0.impl.NewProxyConnection" {:toucan2.jdbc.query/sql-args ["UPDATE revision\n               SET object = JSON_SET(\n                   object,\n                   '$.type',\n                   CASE\n                       WHEN JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) = 'true' THEN 'model'\n                       ELSE 'question'\n                   END)\n               WHERE model = 'Card' AND JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) IS NOT NULL;;"]}] ["resolve connection" {:toucan2.connection/connectable org.mariadb.jdbc.MariaDbConnection}] ["resolve connection" {:toucan2.connection/connectable nil}] {:toucan2.pipeline/rf #object[clojure.core$map$fn__5931$fn__5932 0x75b34b86 "clojure.core$map$fn__5931$fn__5932@75b34b86"]} ["with compiled query" {:toucan2.pipeline/compiled-query ["UPDATE revision\n               SET object = JSON_SET(\n                   object,\n                   '$.type',\n                   CASE\n                       WHEN JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) = 'true' THEN 'model'\n                       ELSE 'question'\n                   END)\n               WHERE model = 'Card' AND JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) IS NOT NULL;;"]}] ["with built query" {:toucan2.pipeline/built-query ["UPDATE revision\n               SET object = JSON_SET(\n                   object,\n                   '$.type',\n                   CASE\n                       WHEN JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) = 'true' THEN 'model'\n                       ELSE 'question'\n                   END)\n               WHERE model = 'Card' AND JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) IS NOT NULL;;"]}] ["with resolved query" {:toucan2.pipeline/resolved-query ["UPDATE revision\n               SET object = JSON_SET(\n                   object,\n                   '$.type',\n                   CASE\n                       WHEN JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) = 'true' THEN 'model'\n                       ELSE 'question'\n                   END)\n               WHERE model = 'Card' AND JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) IS NOT NULL;;"]}] ["with parsed args" {:toucan2.pipeline/query-type :toucan.result-type/*, :toucan2.pipeline/parsed-args {:connectable nil, :queryable ["UPDATE revision\n               SET object = JSON_SET(\n                   object,\n                   '$.type',\n                   CASE\n                       WHEN JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) = 'true' THEN 'model'\n                       ELSE 'question'\n                   END)\n               WHERE model = 'Card' AND JSON_UNQUOTE(JSON_EXTRACT(object, '$.dataset')) IS NOT NULL;;"]}}] ["with model" {:toucan2.pipeline/model nil}] ["resolve connection" {:toucan2.connection/connectable org.mariadb.jdbc.MariaDbConnection}] ["resolve connection" {:toucan2.connection/connectable nil}]]}

It appears that the migration script gets so far as to create tables in the target DB, but then falls over.

I have tried re-creating the MariaDB database with different collations (utf8mb3 for ex.) but this appears to make no difference and we get the same error.

Any help or advice on how we can successfully migrate to MariDB would be very much appreciated.

Thanks!

I'm wondering if changing the collation to something more generic might solve the issue

Hi thanks for the reply, but as mentioned in my post, I already tried re-creating the DB on my MariaDB server using:

Charset: utf8mb4
Collation: utf8mb4_unicode_ci

Charset: utf8mb4
Collation: utf8mb4_general_ci

Charset: utf8mb3
Collation: utf8mb3_unicode_ci

Charset: utf8mb3
Collation: utf8mb3_general_ci

And of course, Metabase's own documentation clearly states that utf8mb4 should be used.

Surely we're not the only users to want to use MySQL/MariaDB to store the production DB for Metabase? This seems like a fundamental migration scripting bug to me.

Would really appreciate further assistance.

Thank you.