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