Разница в сопоставлении между официальным и Oracle Docker образами MySQL 8.0

#mysql #docker

#mysql #docker

Вопрос:

У нас есть среда разработки, которая запускается с использованием mysql:8.0.18 библиотеки Docker. Этот образ не предоставляет многоархивные (читай: 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. В чем коренная разница между официальным образом Docker для MySQL 8.0.18 и копией, предоставленной Oracle, и
  2. Как мы можем настроить наш mysql/mysql-server контейнер, чтобы он вел себя более похоже mysql ?

Ссылки:

Официальное изображение: https://hub.docker.com/_/mysql

Образ Oracle: https://hub.docker.com/r/mysql/mysql-server /

Комментарии:

1. В сообщении об ошибке сообщается, что вы пытаетесь сравнить значение столбца и строкового литерала. utf8mb4_unicode_ci отсутствует в настройках — это означает, что он был установлен для столбца, таблицы или строки базы данных при создании. Вы можете изменить таблицу. Вы можете изменить сопоставление соединений. Вы можете указать сопоставление в тексте запроса.

2. Спасибо @Akina, почему мы решили изменить таблицу или текст запроса, когда другая сборка MySQL 8.0.18 справляется с этим нормально — это потенциально настройка системы / среды, которую мы можем изменить в самом контейнере Docker? Обратите внимание, что это воспроизводимо: начиная с fresh empty mysql и mysql/mysql-server контейнеров, миграция завершается успешно на одном и завершается неудачей на другом.

3. Я не использую docker, поэтому не могу ничего сказать о его предопределенных установках. Попробуйте сравнить их списки настроек (экспортировать ПЕРЕМЕННЫЕ ПОКАЗА и сравнивать по строкам), найдите различия, которые могут вызвать вашу проблему.

Ответ №1:

Оказывается, наш обычай my.cnf не читался. Мы размещали его на:

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

Который работает для официального mysql образа, но в mysql/mysql-server варианте он должен быть размещен в:

 /etc/my.cnf