Как избавиться от ошибки с кодировкой при создании контейнера?
Ситуация следующая. Через docker-compose создаю контейнер на основе официального образа последней версии MySQL с командой command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci.
Но подключаюсь к БД через Workbench и вижу, что у БД установлена правильная кодировка utf8mb4, а вот дефолтное сравнение — utf8mb4_0900_ai_ci вместо ожидаемого utf8mb4_unicode_ci, а команда mysql> show charset в числе прочих кодировок выводит строку utf8mb4 | UTF-8 Unicode | utf8mb4_0900_ai_ci | 4.
Как заставить запускаться контейнеры в нужной кодировке и сравнении?
Под дефолтным я имел ввиду то, что находится напротив utf8mb4 (последняя строка вывода show charset):
Всё бы ничего, но данные хранятся в utf8mb4_unicode_ci. К слову, обнаружилась проблема с кодировками когда при попытке дампа из БД вернулось сообщение:
mysqldump: Character set 'utf8bm4' is not a compiled character set and is not specified in the '/usr/share/mysql-8.0/charsets/Index.xml' file
Так вот - нет никакого дефолтного сравнения. Default collation - это collation, присваиваемый литералу при изменении charset (CONVERT() function).
В твоём случае utf8mb4_0900_ai_ci имеет collation соединения. Именно такой collation будет использоваться для всех строковых литералов, передаваемых в тексте запроса. Изменить это можно двумя способами - либо изменить настройки соединения
SET SESSION collation_connection = {нужный collation};
, либо указывать collation непосредственно в тексте запроса.
Akina, причём здесь текущая сессия если запрос docker exec КОНТЕЙНЕР sh -c 'exec mysqldump -uroot -p --default-character-set=utf8bm4 --databases НАЗВАНИЕ БД' > dump.sql возвращает ошибку, текст которой я привёл в предыдущем сообщении? А без него в дамп падает что-то типа ╨в╨╡╤Б╤В╨╛╨▓╤Л╨╣ ╨╕╨▓╨╡╨╜╤В вместо кириллицы
Akina, я похоже чего-то из ваших слов не понимаю, но как ваши ответы связаны с тем, что при вливании данных из дампа с utf8mb4_unicode_ci в таблицах отображается utf8mb4_0900_ai_ci?
Да при том, что дамп - это текстовый файл с запросами. А эти запросы выполняются (вот сюрприз!) в сессии (соединении, установленном программой mysqldump с сервером MySQL). И вот настройки этой сессии, которая для запросов из файла текущая, не позволяют выполнить эти запросы из-за проблем с кодировкой.
как ваши ответы связаны с тем, что при вливании данных из дампа с utf8mb4_unicode_ci в таблицах отображается utf8mb4_0900_ai_ci?
Свойства таблицы никак не связаны с выполняемым и вызывающим ошибку запросом.
Предполагаю, что в скрипте создания этой таблицы charset указан явно, а вот collation не указан, потому присваивается default collation.