首页 > 解决方案 > MySQL 8.0官方和Oracle Docker镜像的排序差异

问题描述

我们有一个使用mysql:8.0.18Docker 库启动的开发环境。此映像不提供多架构(阅读:arm64)构建,因此我们想mysql/mysql-server:8.0.18改用。

但是 - 我们在我们的应用容器启动期间(运行迁移时)一直遇到问题,mysql/mysql-server 使用:

ERROR: Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8mb4_0900_ai_ci,IMPLICIT) for operation '='

查看故障服务器的字符/排序规则变量:

mysql> show variables like "%collat%";
+-------------------------------+--------------------+
| Variable_name                 | Value              |
+-------------------------------+--------------------+
| collation_connection          | latin1_swedish_ci  |
| collation_database            | utf8mb4_0900_ai_ci |
| collation_server              | utf8mb4_0900_ai_ci |
| default_collation_for_utf8mb4 | utf8mb4_0900_ai_ci |
+-------------------------------+--------------------+
4 rows in set (0.01 sec)

mysql> show variables like "%character%";
+--------------------------+--------------------------------+
| Variable_name            | Value                          |
+--------------------------+--------------------------------+
| character_set_client     | latin1                         |
| character_set_connection | latin1                         |
| character_set_database   | utf8mb4                        |
| character_set_filesystem | binary                         |
| character_set_results    | latin1                         |
| character_set_server     | utf8mb4                        |
| character_set_system     | utf8                           |
| character_sets_dir       | /usr/share/mysql-8.0/charsets/ |
+--------------------------+--------------------------------+
8 rows in set (0.01 sec)

mysql>

我们有一个小的my.cnf,它被放入两个图像中:

[mysqld]
explicit_defaults_for_timestamp=ON
sql_mode=NO_ENGINE_SUBSTITUTION
character_set_server=utf8     # removing this line has no effect on this issue

我有两个主要问题:

  1. MySQL 8.0.18 的官方 Docker 镜像和 Oracle 提供的副本之间的根本区别是什么,以及
  2. 我们如何配置我们的mysql/mysql-server容器以使其表现得更像mysql

链接:

官方图片:https ://hub.docker.com/_/mysql

Oracle 镜像:https ://hub.docker.com/r/mysql/mysql-server/

标签: mysqldocker

解决方案


原来我们的习惯my.cnf没有被阅读。我们把它放在:

/etc/mysql/conf.d/my.cnf

哪个适用于官方mysql图像,但在mysql/mysql-server变体中,它应该放在:

/etc/my.cnf

推荐阅读